home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / decoder / txt / decodejpeg.c < prev    next >
C/C++ Source or Header  |  1999-02-08  |  97KB  |  3,005 lines

  1. /*
  2. sc:c/sc opt txt/DecodeJPEG.c
  3. */
  4.  
  5. #include "Decode.h"
  6. #include "YUV.h"
  7. #include "Utils.h"
  8. #include "GlobalVars.h"
  9. #include "JPEG.h"
  10.  
  11. /* /// "define's und Variablen" */
  12. ulong bytes_pixel;
  13. extern long xa_dither_flag;
  14.  
  15. uchar  *jpg_buff = 0;
  16. long  jpg_bsize = 0;
  17.  
  18. long   jpg_h_bnum;
  19. ulong  jpg_h_bbuf;
  20.  
  21. long   *jpg_quant_tables[JJ_NUM_QUANT_TBLS];
  22. ulong  jpg_marker = 0;
  23. ulong  jpg_saw_SOI,jpg_saw_SOF,jpg_saw_SOS;
  24. ulong  jpg_saw_DHT,jpg_saw_DQT,jpg_saw_EOI;
  25. ulong  jpg_std_DHT_flag = 0;
  26. long   jpg_dprec,jpg_height,jpg_width;
  27. long   jpg_num_comps,jpg_comps_in_scan;
  28. long   jpg_nxt_rst_num;
  29. long   jpg_rst_interval;
  30.  
  31. ulong xa_mjpg_kludge;
  32.  
  33. JJ_HUFF_TBL jpg_ac_huff[JJ_NUM_HUFF_TBLS];
  34. JJ_HUFF_TBL jpg_dc_huff[JJ_NUM_HUFF_TBLS];
  35.  
  36. COMPONENT_HDR jpg_comps[JPG_MAX_COMPS + 1];
  37.  
  38. long JJ_ZAG[DCTSIZE2+16] = {
  39.   0,  1,  8, 16,  9,  2,  3, 10,
  40.  17, 24, 32, 25, 18, 11,  4,  5,
  41.  12, 19, 26, 33, 40, 48, 41, 34,
  42.  27, 20, 13,  6,  7, 14, 21, 28,
  43.  35, 42, 49, 56, 57, 50, 43, 36,
  44.  29, 22, 15, 23, 30, 37, 44, 51,
  45.  58, 59, 52, 45, 38, 31, 39, 46,
  46.  53, 60, 61, 54, 47, 55, 62, 63,
  47.   0,  0,  0,  0,  0,  0,  0,  0,
  48.   0,  0,  0,  0,  0,  0,  0,  0
  49. };
  50.  
  51. ulong jpg_MCUbuf_size = 0;
  52. uchar *jpg_Ybuf = 0;
  53. uchar *jpg_Ubuf = 0;
  54. uchar *jpg_Vbuf = 0;
  55. short jpg_dct_buf[DCTSIZE2];
  56. /* \\\ */
  57.  
  58. struct JPEGData {
  59.   long *quantTab[JJ_NUM_QUANT_TBLS];
  60. };
  61.  
  62. struct JPEGData *JPGData;
  63.  
  64. /* /// "proto-types" */
  65. ulong jpg_decode_111111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey, ulong gray);
  66. ulong jpg_decode_211111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey);
  67. ulong jpg_decode_221111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey);
  68. ulong jpg_decode_411111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey);
  69. void __regargs (*mcu111111) (uchar *to, ulong width, ulong height, ulong rowSize, ulong ipSize);
  70. void __regargs (*mcu211111) (uchar *to, ulong width, ulong height, ulong rowSize, ulong ipSize);
  71. void __regargs (*mcu221111) (uchar *to, ulong width, ulong height, ulong rowSize, ulong ipSize);
  72. void __regargs (*mcu411111) (uchar *to, ulong width, ulong height, ulong rowSize, ulong ipSize);
  73. void jpg_huff_build(JJ_HUFF_TBL *htbl, uchar *hbits, uchar *hvals);
  74. ulong jpg_huffparse(register COMPONENT_HDR *comp, register short *dct_buf, ulong *qtab, uchar *OBuf);
  75. void j_rev_dct (short *data, uchar *outptr, uchar *rnglimit);
  76. void JPG_Setup_Samp_Limit_Table();
  77. void JPG_Free_Samp_Limit_Table();
  78. ulong jpg_std_DHT(void);
  79. ulong jpg_search_marker(ulong marker, uchar **data_ptr, long *data_size);
  80. ulong jpg_read_SOI(void);
  81. ulong jpg_read_SOF(void);
  82. ulong jpg_read_SOS(void);
  83. ulong jpg_read_DQT(void);
  84. ulong jpg_read_DRI(void);
  85. ulong jpg_read_DHT(void);
  86. ulong jpg_skip_marker(void);
  87. ulong jpg_get_marker(void);
  88. ulong jpg_read_markers(void);
  89. ulong jpg_read_EOI_marker(void);
  90. ulong jpg_read_RST_marker(void);
  91. void jpg_init_input(uchar *buff, long buff_size);
  92. void jpg_huff_reset(void);
  93. /* \\\ */
  94.  
  95. /* /// "mcu1hInnerTail" */
  96. #define mcu1hInnerTail(inc1) { \
  97.   skip++;                      \
  98.   if (skip>=8) {               \
  99.     skip=0;                    \
  100.     yp+=inc1;                  \
  101.     up+=inc1;                  \
  102.     vp+=inc1;                  \
  103.   }                            \
  104. }
  105. /* \\\ */
  106.  
  107. /* /// "mcu2hInnerTail" */
  108. #define mcu2hInnerTail(inc1,inc2) { \
  109.   skip++;                           \
  110.   if (skip==4)                      \
  111.     yp+=inc1;                       \
  112.   else                              \
  113.     if (skip>=8) {                  \
  114.       skip=0;                       \
  115.       yp+=inc2;                     \
  116.       up+=inc1;                     \
  117.       vp+=inc1;                     \
  118.     }                               \
  119. }
  120. /* \\\ */
  121.  
  122. /* /// "mcu4hInnerTail" */
  123. #define mcu4hInnerTail(inc1,inc2) { \
  124.   skip++;                           \
  125.   if (skip>=8) {                    \
  126.     skip=0;                         \
  127.     yp+=inc2;                       \
  128.     up+=inc1;                       \
  129.     vp+=inc1;                       \
  130.   } else                            \
  131.     if (!(skip & 1)) yp+=inc1;      \
  132. }
  133. /* \\\ */
  134.  
  135. /* /// "MCU111111toRGB()" */
  136. void __regargs MCU111111toRGB(uchar *to,
  137.                               ulong width,
  138.                               ulong height,
  139.                               ulong rowSize,
  140.                               ulong ipSize)
  141. {
  142.   long *ubTab=yuvTab->ubTab;
  143.   long *vrTab=yuvTab->vrTab;
  144.   long *ugTab=yuvTab->ugTab;
  145.   long *vgTab=yuvTab->vgTab;
  146.   long *yTab=yuvTab->yTab;
  147.   uchar *yBuf=yuvBuf->yBuf;
  148.   uchar *uBuf=yuvBuf->uBuf;
  149.   uchar *vBuf=yuvBuf->vBuf;
  150.  
  151.   ipSize>>=2;
  152.   while (height>0) {
  153.     RGBTriple *iptr=(RGBTriple *)to;
  154.     uchar *yptr=yBuf;
  155.     uchar *uptr=uBuf;
  156.     uchar *vptr=vBuf;
  157.     ulong xi, yi, skip;
  158.     for (yi=0; yi<8; yi++) {
  159.       RGBTriple *ip=iptr;
  160.       uchar *yp=yptr;
  161.       uchar *up=uptr;
  162.       uchar *vp=vptr;
  163.       if (height<=0) return;
  164.       xi=width;
  165.       skip=0;
  166.       while (xi--) {
  167.         ulong u0=*up++;
  168.         ulong v0=*vp++;
  169.         long cr=vrTab[v0];
  170.         long cg=vgTab[v0]+ugTab[u0];
  171.         long cb=ubTab[u0];
  172.         iDecYUVRGB(ip[0],*yp++,cr,cg,cb);
  173.         mcu1hInnerTail(56);
  174.         ip++;
  175.       }
  176.       yptr+=8;
  177.       uptr+=8;
  178.       vptr+=8;
  179.       height--;
  180.       iptr+=ipSize;
  181.     }
  182.     yBuf+=rowSize;
  183.     uBuf+=rowSize;
  184.     vBuf+=rowSize;
  185.   }
  186. }
  187. /* \\\ */
  188.  
  189. /* /// "MCU111111to332()" */
  190. void __regargs MCU111111to332(uchar *to,
  191.                               ulong width,
  192.                               ulong height,
  193.                               ulong rowSize,
  194.                               ulong ipSize)
  195. {
  196.   long *ubTab=yuvTab->ubTab;
  197.   long *vrTab=yuvTab->vrTab;
  198.   long *ugTab=yuvTab->ugTab;
  199.   long *vgTab=yuvTab->vgTab;
  200.   long *yTab=yuvTab->yTab;
  201.   uchar *yBuf=yuvBuf->yBuf;
  202.   uchar *uBuf=yuvBuf->uBuf;
  203.   uchar *vBuf=yuvBuf->vBuf;
  204.  
  205.   while (height>0) {
  206.     uchar *iptr=(uchar *)to;
  207.     uchar *yptr=yBuf;
  208.     uchar *uptr=uBuf;
  209.     uchar *vptr=vBuf;
  210.     ulong xi, yi, skip;
  211.     for (yi=0; yi<8; yi++) {
  212.       uchar *ip=iptr;
  213.       uchar *yp=yptr;
  214.       uchar *up=uptr;
  215.       uchar *vp=vptr;
  216.       if (height<=0) return;
  217.       xi=width;
  218.       skip=0;
  219.       while (xi--) {
  220.         if (gray) {
  221.           *ip++=*yp++;
  222.         } else {
  223.           ulong u0=*up++;
  224.           ulong v0=*vp++;
  225.           long cr=vrTab[v0];
  226.           long cg=vgTab[v0]+ugTab[u0];
  227.           long cb=ubTab[u0];
  228.           DecYUV332(ip,*yp++,cr,cg,cb);
  229.         }
  230.         mcu1hInnerTail(56);
  231.       }
  232.       yptr+=8;
  233.       uptr+=8;
  234.       vptr+=8;
  235.       height--;
  236.       iptr+=ipSize;
  237.     }
  238.     yBuf+=rowSize;
  239.     uBuf+=rowSize;
  240.     vBuf+=rowSize;
  241.   }
  242. }
  243. /* \\\ */
  244.  
  245. /* /// "MCU111111to332Dith()" */
  246. void __regargs MCU111111to332Dith(uchar *to,
  247.                                   ulong width,
  248.                                   ulong height,
  249.                                   ulong rowSize,
  250.                                   ulong ipSize)
  251. {
  252.   long *ubTab=yuvTab->ubTab;
  253.   long *vrTab=yuvTab->vrTab;
  254.   long *ugTab=yuvTab->ugTab;
  255.   long *vgTab=yuvTab->vgTab;
  256.   long *yTab=yuvTab->yTab;
  257.   uchar *yBuf=yuvBuf->yBuf;
  258.   uchar *uBuf=yuvBuf->uBuf;
  259.   uchar *vBuf=yuvBuf->vBuf;
  260.  
  261.   while (height>0) {
  262.     uchar *iptr=(uchar *)to;
  263.     uchar *yptr=yBuf;
  264.     uchar *uptr=uBuf;
  265.     uchar *vptr=vBuf;
  266.     ulong xi, yi, skip;
  267.     for (yi=0; yi<8; yi++) {
  268.       uchar *ip=iptr;
  269.       uchar *yp=yptr;
  270.       uchar *up=uptr;
  271.       uchar *vp=vptr;
  272.       long re=0, ge=0, be=0;
  273.       if (height<=0) return;
  274.       xi=width;
  275.       skip=0;
  276.       while (xi--) {
  277.         ulong u0=*up++;
  278.         ulong v0=*vp++;
  279.         long cr=vrTab[v0];
  280.         long cg=vgTab[v0]+ugTab[u0];
  281.         long cb=ubTab[u0];
  282.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  283.         mcu1hInnerTail(56);
  284.       }
  285.       yptr+=8;
  286.       uptr+=8;
  287.       vptr+=8;
  288.       height--;
  289.       iptr+=ipSize;
  290.     }
  291.     yBuf+=rowSize;
  292.     uBuf+=rowSize;
  293.     vBuf+=rowSize;
  294.   }
  295. }
  296. /* \\\ */
  297.  
  298. /* /// "MCU111111toGray()" */
  299. void __regargs MCU111111toGray(uchar *to,
  300.                                ulong width,
  301.                                ulong height,
  302.                                ulong rowSize,
  303.                                ulong ipSize)
  304. {
  305.   uchar *yBuf=yuvBuf->yBuf;
  306.  
  307.   while (height>0) {
  308.     uchar *iptr=(uchar *)to;
  309.     uchar *yptr=yBuf;
  310.     ulong xi, yi, skip;
  311.     for (yi=0; yi<8; yi++) {
  312.       uchar *ip=iptr;
  313.       uchar *yp=yptr;
  314.       if (height<=0) return;
  315.       xi=width;
  316.       skip=0;
  317.       while (xi--) {
  318.         *ip++=*yp++;
  319.         skip++;
  320.         if (skip>=8) {skip=0; yp+=56; }
  321.       }
  322.       yptr+=8;
  323.       height--;
  324.       iptr+=ipSize;
  325.     }
  326.     yBuf+=rowSize;
  327.   }
  328. }
  329. /* \\\ */
  330.  
  331. /* /// "MCU211111toRGB()" */
  332. void __regargs MCU211111toRGB(uchar *to,
  333.                               ulong width,
  334.                               ulong height,
  335.                               ulong rowSize,
  336.                               ulong ipSize)
  337. {
  338.   long *ubTab=yuvTab->ubTab;
  339.   long *vrTab=yuvTab->vrTab;
  340.   long *ugTab=yuvTab->ugTab;
  341.   long *vgTab=yuvTab->vgTab;
  342.   long *yTab=yuvTab->yTab;
  343.   uchar *yBuf=yuvBuf->yBuf;
  344.   uchar *uBuf=yuvBuf->uBuf;
  345.   uchar *vBuf=yuvBuf->vBuf;
  346.  
  347.   ipSize>>=2;
  348.   while (height>0) {
  349.     RGBTriple *iptr=(RGBTriple *)to;
  350.     uchar *yptr=yBuf;
  351.     uchar *uptr=uBuf;
  352.     uchar *vptr=vBuf;
  353.     ulong xi, yi, skip;
  354.     for (yi=0; yi<8; yi++) {
  355.       RGBTriple *ip=iptr;
  356.       uchar *yp=yptr;
  357.       uchar *up=uptr;
  358.       uchar *vp=vptr;
  359.       if (height<=0) return;
  360.       xi=width;
  361.       skip=0;
  362.       while (xi--) {
  363.         ulong u0=*up++;
  364.         ulong v0=*vp++;
  365.         long cr=vrTab[v0];
  366.         long cg=vgTab[v0]+ugTab[u0];
  367.         long cb=ubTab[u0];
  368.         iDecYUVRGB(ip[0],*yp++,cr,cg,cb);
  369.         iDecYUVRGB(ip[1],*yp++,cr,cg,cb);
  370.         mcu2hInnerTail(56,56);
  371.         ip+=2;
  372.       }
  373.       yptr+=8;
  374.       uptr+=8;
  375.       vptr+=8;
  376.       height--;
  377.       iptr+=ipSize;
  378.     }
  379.     yBuf+=rowSize<<1;
  380.     uBuf+=rowSize;
  381.     vBuf+=rowSize;
  382.   }
  383. }
  384. /* \\\ */
  385.  
  386. /* /// "MCU211111to332()" */
  387. void __regargs MCU211111to332(uchar *to,
  388.                               ulong width,
  389.                               ulong height,
  390.                               ulong rowSize,
  391.                               ulong ipSize)
  392. {
  393.   long *ubTab=yuvTab->ubTab;
  394.   long *vrTab=yuvTab->vrTab;
  395.   long *ugTab=yuvTab->ugTab;
  396.   long *vgTab=yuvTab->vgTab;
  397.   long *yTab=yuvTab->yTab;
  398.   uchar *yBuf=yuvBuf->yBuf;
  399.   uchar *uBuf=yuvBuf->uBuf;
  400.   uchar *vBuf=yuvBuf->vBuf;
  401.  
  402.   while (height>0) {
  403.     uchar *iptr=(uchar *)to;
  404.     uchar *yptr=yBuf;
  405.     uchar *uptr=uBuf;
  406.     uchar *vptr=vBuf;
  407.     ulong xi, yi, skip;
  408.     for (yi=0; yi<8; yi++) {
  409.       uchar *ip=iptr;
  410.       uchar *yp=yptr;
  411.       uchar *up=uptr;
  412.       uchar *vp=vptr;
  413.       if (height<=0) return;
  414.       xi=width;
  415.       skip=0;
  416.       while (xi--) {
  417.         if (gray) {
  418.           ip[0]=yp[0];
  419.           ip[1]=yp[1];
  420.           ip+=2;
  421.           yp+=2;
  422.         } else {
  423.           ulong u0=*up++;
  424.           ulong v0=*vp++;
  425.           long cr=vrTab[v0];
  426.           long cg=vgTab[v0]+ugTab[u0];
  427.           long cb=ubTab[u0];
  428.           DecYUV332(ip,*yp++,cr,cg,cb);
  429.           DecYUV332(ip,*yp++,cr,cg,cb);
  430.         }
  431.         mcu2hInnerTail(56,56);
  432.       }
  433.       yptr+=8;
  434.       uptr+=8;
  435.       vptr+=8;
  436.       height--;
  437.       iptr+=ipSize;
  438.     }
  439.     yBuf+=rowSize<<1;
  440.     uBuf+=rowSize;
  441.     vBuf+=rowSize;
  442.   }
  443. }
  444. /* \\\ */
  445.  
  446. /* /// "MCU211111to332Dith()" */
  447. void __regargs MCU211111to332Dith(uchar *to,
  448.                                   ulong width,
  449.                                   ulong height,
  450.                                   ulong rowSize,
  451.                                   ulong ipSize)
  452. {
  453.   long *ubTab=yuvTab->ubTab;
  454.   long *vrTab=yuvTab->vrTab;
  455.   long *ugTab=yuvTab->ugTab;
  456.   long *vgTab=yuvTab->vgTab;
  457.   long *yTab=yuvTab->yTab;
  458.   uchar *yBuf=yuvBuf->yBuf;
  459.   uchar *uBuf=yuvBuf->uBuf;
  460.   uchar *vBuf=yuvBuf->vBuf;
  461.  
  462.   while (height>0) {
  463.     uchar *iptr=(uchar *)to;
  464.     uchar *yptr=yBuf;
  465.     uchar *uptr=uBuf;
  466.     uchar *vptr=vBuf;
  467.     ulong xi, yi, skip;
  468.     for (yi=0; yi<8; yi++) {
  469.       uchar *ip=iptr;
  470.       uchar *yp=yptr;
  471.       uchar *up=uptr;
  472.       uchar *vp=vptr;
  473.       long re=0, ge=0, be=0;
  474.       if (height<=0) return;
  475.       xi=width;
  476.       skip=0;
  477.       while (xi--) {
  478.         ulong u0=*up++;
  479.         ulong v0=*vp++;
  480.         long cr=vrTab[v0];
  481.         long cg=vgTab[v0]+ugTab[u0];
  482.         long cb=ubTab[u0];
  483.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  484.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  485.         mcu2hInnerTail(56,56);
  486.       }
  487.       yptr+=8;
  488.       uptr+=8;
  489.       vptr+=8;
  490.       height--;
  491.       iptr+=ipSize;
  492.     }
  493.     yBuf+=rowSize<<1;
  494.     uBuf+=rowSize;
  495.     vBuf+=rowSize;
  496.   }
  497. }
  498. /* \\\ */
  499.  
  500. /* /// "MCU221111toRGB()" */
  501. void __regargs MCU221111toRGB(uchar *to,
  502.                               ulong width,
  503.                               ulong height,
  504.                               ulong rowSize,
  505.                               ulong ipSize)
  506. {
  507.   long *ubTab=yuvTab->ubTab;
  508.   long *vrTab=yuvTab->vrTab;
  509.   long *ugTab=yuvTab->ugTab;
  510.   long *vgTab=yuvTab->vgTab;
  511.   long *yTab=yuvTab->yTab;
  512.   uchar *yBuf=yuvBuf->yBuf;
  513.   uchar *uBuf=yuvBuf->uBuf;
  514.   uchar *vBuf=yuvBuf->vBuf;
  515.  
  516.   ipSize>>=2;
  517.   while (height>0) {
  518.     RGBTriple *iptr=(RGBTriple *)to;
  519.     uchar *yptr=yBuf;
  520.     uchar *uptr=uBuf;
  521.     uchar *vptr=vBuf;
  522.     ulong xi, yi, skip;
  523.     for (yi=0; yi<8; yi++) {
  524.       RGBTriple *ip0, *ip1;
  525.       uchar *yp, *up, *vp;
  526.       if (height<=0) return;
  527.       if (yi==4) yptr+=64;
  528.       yp=yptr; up=uptr; vp=vptr;
  529.       ip0=iptr;
  530.       iptr+=ipSize;
  531.       ip1=iptr;
  532.       iptr+=ipSize;
  533.       xi=width;
  534.       skip=0;
  535.       while (xi--) {
  536.         ulong u0=*up++;
  537.         ulong v0=*vp++;
  538.         long cr=vrTab[v0];
  539.         long cg=vgTab[v0]+ugTab[u0];
  540.         long cb=ubTab[u0];
  541.         iDecYUVRGB(ip1[0],yp[8],cr,cg,cb);
  542.         iDecYUVRGB(ip0[0],*yp++,cr,cg,cb);
  543.         iDecYUVRGB(ip1[1],yp[8],cr,cg,cb);
  544.         iDecYUVRGB(ip0[1],*yp++,cr,cg,cb);
  545.         mcu2hInnerTail(56,184);
  546.         ip0+=2;
  547.         ip1+=2;
  548.       }
  549.       yptr+=16;
  550.       uptr+=8;
  551.       vptr+=8;
  552.       height-=2;
  553.     }
  554.     yBuf+=rowSize<<2;
  555.     uBuf+=rowSize;
  556.     vBuf+=rowSize;
  557.   }
  558. }
  559. /* \\\ */
  560.  
  561. /* /// "MCU221111to332()" */
  562. void __regargs MCU221111to332(uchar *to,
  563.                               ulong width,
  564.                               ulong height,
  565.                               ulong rowSize,
  566.                               ulong ipSize)
  567. {
  568.   long *ubTab=yuvTab->ubTab;
  569.   long *vrTab=yuvTab->vrTab;
  570.   long *ugTab=yuvTab->ugTab;
  571.   long *vgTab=yuvTab->vgTab;
  572.   long *yTab=yuvTab->yTab;
  573.   uchar *yBuf=yuvBuf->yBuf;
  574.   uchar *uBuf=yuvBuf->uBuf;
  575.   uchar *vBuf=yuvBuf->vBuf;
  576.  
  577.   while (height>0) {
  578.     uchar *iptr=(uchar *)to;
  579.     uchar *yptr=yBuf;
  580.     uchar *uptr=uBuf;
  581.     uchar *vptr=vBuf;
  582.     ulong xi, yi, skip;
  583.     for (yi=0; yi<8; yi++) {
  584.       uchar *ip0, *ip1;
  585.       uchar *yp, *up, *vp;
  586.       if (height<=0) return;
  587.       if (yi==4) yptr+=64;
  588.       yp=yptr; up=uptr; vp=vptr;
  589.       ip0=iptr;
  590.       iptr+=ipSize;
  591.       ip1=iptr;
  592.       iptr+=ipSize;
  593.       xi=width;
  594.       skip=0;
  595.       while (xi--) {
  596.         if (gray) {
  597.           *ip1++=yp[8];
  598.           *ip0++=*yp++;
  599.           *ip1++=yp[8];
  600.           *ip0++=*yp++;
  601.         } else {
  602.           ulong u0=*up++;
  603.           ulong v0=*vp++;
  604.           long cr=vrTab[v0];
  605.           long cg=vgTab[v0]+ugTab[u0];
  606.           long cb=ubTab[u0];
  607.           DecYUV332(ip1,yp[8],cr,cg,cb);
  608.           DecYUV332(ip0,*yp++,cr,cg,cb);
  609.           DecYUV332(ip1,yp[8],cr,cg,cb);
  610.           DecYUV332(ip0,*yp++,cr,cg,cb);
  611.         }
  612.         mcu2hInnerTail(56,184);
  613.       }
  614.       yptr+=16;
  615.       uptr+=8;
  616.       vptr+=8;
  617.       height-=2;
  618.     }
  619.     yBuf+=rowSize<<2;
  620.     uBuf+=rowSize;
  621.     vBuf+=rowSize;
  622.   }
  623. }
  624. /* \\\ */
  625.  
  626. /* /// "MCU221111to332Dith()" */
  627. void __regargs MCU221111to332Dith(uchar *to,
  628.                                   ulong width,
  629.                                   ulong height,
  630.                                   ulong rowSize,
  631.                                   ulong ipSize)
  632. {
  633.   long *ubTab=yuvTab->ubTab;
  634.   long *vrTab=yuvTab->vrTab;
  635.   long *ugTab=yuvTab->ugTab;
  636.   long *vgTab=yuvTab->vgTab;
  637.   long *yTab=yuvTab->yTab;
  638.   uchar *yBuf=yuvBuf->yBuf;
  639.   uchar *uBuf=yuvBuf->uBuf;
  640.   uchar *vBuf=yuvBuf->vBuf;
  641.  
  642.   while (height>0) {
  643.     uchar *iptr=(uchar *)to;
  644.     uchar *yptr=yBuf;
  645.     uchar *uptr=uBuf;
  646.     uchar *vptr=vBuf;
  647.     ulong xi, yi, skip;
  648.     for (yi=0; yi<8; yi++) {
  649.       uchar *ip0, *ip1;
  650.       uchar *yp, *up, *vp;
  651.       long re=0, ge=0, be=0;
  652.       if (height<=0) return;
  653.       if (yi==4) yptr+=64;
  654.       yp=yptr; up=uptr; vp=vptr;
  655.       ip0=iptr;
  656.       iptr+=ipSize;
  657.       ip1=iptr;
  658.       iptr+=ipSize;
  659.       xi=width;
  660.       skip=0;
  661.       while (xi--) {
  662.         ulong u0=*up++;
  663.         ulong v0=*vp++;
  664.         long cr=vrTab[v0];
  665.         long cg=vgTab[v0]+ugTab[u0];
  666.         long cb=ubTab[u0];
  667.         DecYUV332Dith(*ip1++,yp[8],cr,cg,cb);
  668.         DecYUV332Dith(*ip0++,*yp++,cr,cg,cb);
  669.         DecYUV332Dith(*ip1++,yp[8],cr,cg,cb);
  670.         DecYUV332Dith(*ip0++,*yp++,cr,cg,cb);
  671.         mcu2hInnerTail(56,184);
  672.       }
  673.       yptr+=16;
  674.       uptr+=8;
  675.       vptr+=8;
  676.       height-=2;
  677.     }
  678.     yBuf+=rowSize<<2;
  679.     uBuf+=rowSize;
  680.     vBuf+=rowSize;
  681.   }
  682. }
  683. /* \\\ */
  684.  
  685. /* /// "MCU411111toRGB()" */
  686. void __regargs MCU411111toRGB(uchar *to,
  687.                               ulong width,
  688.                               ulong height,
  689.                               ulong rowSize,
  690.                               ulong ipSize)
  691. {
  692.   long *ubTab=yuvTab->ubTab;
  693.   long *vrTab=yuvTab->vrTab;
  694.   long *ugTab=yuvTab->ugTab;
  695.   long *vgTab=yuvTab->vgTab;
  696.   long *yTab=yuvTab->yTab;
  697.   uchar *yBuf=yuvBuf->yBuf;
  698.   uchar *uBuf=yuvBuf->uBuf;
  699.   uchar *vBuf=yuvBuf->vBuf;
  700.  
  701.   ipSize>>=2;
  702.   while (height>0) {
  703.     RGBTriple *iptr=(RGBTriple *)to;
  704.     uchar *yptr=yBuf;
  705.     uchar *uptr=uBuf;
  706.     uchar *vptr=vBuf;
  707.     ulong xi, yi, skip;
  708.     for (yi=0; yi<8; yi++) {
  709.       RGBTriple *ip=iptr;
  710.       uchar *yp=yptr;
  711.       uchar *up=uptr;
  712.       uchar *vp=vptr;
  713.       if (height<=0) return;
  714.       xi=width;
  715.       skip=0;
  716.       while (xi--) {
  717.         ulong u0=*up++;
  718.         ulong v0=*vp++;
  719.         long cr=vrTab[v0];
  720.         long cg=vgTab[v0]+ugTab[u0];
  721.         long cb=ubTab[u0];
  722.         iDecYUVRGB(ip[0],*yp++,cr,cg,cb);
  723.         iDecYUVRGB(ip[1],*yp++,cr,cg,cb);
  724.         iDecYUVRGB(ip[2],*yp++,cr,cg,cb);
  725.         iDecYUVRGB(ip[3],*yp++,cr,cg,cb);
  726.         mcu4hInnerTail(56,56);
  727.         ip+=4;
  728.       }
  729.       yptr+=8;
  730.       uptr+=8;
  731.       vptr+=8;
  732.       height--;
  733.       iptr+=ipSize;
  734.     }
  735.     yBuf+=rowSize<<2;
  736.     uBuf+=rowSize;
  737.     vBuf+=rowSize;
  738.   }
  739. }
  740. /* \\\ */
  741.  
  742. /* /// "MCU411111to332()" */
  743. void __regargs MCU411111to332(uchar *to,
  744.                               ulong width,
  745.                               ulong height,
  746.                               ulong rowSize,
  747.                               ulong ipSize)
  748. {
  749.   long *ubTab=yuvTab->ubTab;
  750.   long *vrTab=yuvTab->vrTab;
  751.   long *ugTab=yuvTab->ugTab;
  752.   long *vgTab=yuvTab->vgTab;
  753.   long *yTab=yuvTab->yTab;
  754.   uchar *yBuf=yuvBuf->yBuf;
  755.   uchar *uBuf=yuvBuf->uBuf;
  756.   uchar *vBuf=yuvBuf->vBuf;
  757.  
  758.   while (height>0) {
  759.     uchar *iptr=(uchar *)to;
  760.     uchar *yptr=yBuf;
  761.     uchar *uptr=uBuf;
  762.     uchar *vptr=vBuf;
  763.     ulong xi, yi, skip;
  764.     for (yi=0; yi<8; yi++) {
  765.       uchar *ip=iptr;
  766.       uchar *yp=yptr;
  767.       uchar *up=uptr;
  768.       uchar *vp=vptr;
  769.       if (height<=0) return;
  770.       xi=width;
  771.       skip=0;
  772.       while (xi--) {
  773.         if (gray) {
  774.           ip[0]=yp[0];
  775.           ip[1]=yp[1];
  776.           ip[2]=yp[2];
  777.           ip[3]=yp[3];
  778.           ip+=4;
  779.           yp+=4;
  780.         } else {
  781.           ulong u0=*up++;
  782.           ulong v0=*vp++;
  783.           long cr=vrTab[v0];
  784.           long cg=vgTab[v0]+ugTab[u0];
  785.           long cb=ubTab[u0];
  786.           DecYUV332(ip,*yp++,cr,cg,cb);
  787.           DecYUV332(ip,*yp++,cr,cg,cb);
  788.           DecYUV332(ip,*yp++,cr,cg,cb);
  789.           DecYUV332(ip,*yp++,cr,cg,cb);
  790.         }
  791.         mcu4hInnerTail(56,56);
  792.       }
  793.       yptr+=8;
  794.       uptr+=8;
  795.       vptr+=8;
  796.       height--;
  797.       iptr+=ipSize;
  798.     }
  799.     yBuf+=rowSize<<2;
  800.     uBuf+=rowSize;
  801.     vBuf+=rowSize;
  802.   }
  803. }
  804. /* \\\ */
  805.  
  806. /* /// "MCU411111to332Dith()" */
  807. void __regargs MCU411111to332Dith(uchar *to,
  808.                                   ulong width,
  809.                                   ulong height,
  810.                                   ulong rowSize,
  811.                                   ulong ipSize)
  812. {
  813.   long *ubTab=yuvTab->ubTab;
  814.   long *vrTab=yuvTab->vrTab;
  815.   long *ugTab=yuvTab->ugTab;
  816.   long *vgTab=yuvTab->vgTab;
  817.   long *yTab=yuvTab->yTab;
  818.   uchar *yBuf=yuvBuf->yBuf;
  819.   uchar *uBuf=yuvBuf->uBuf;
  820.   uchar *vBuf=yuvBuf->vBuf;
  821.  
  822.   while (height>0) {
  823.     uchar *iptr=(uchar *)to;
  824.     uchar *yptr=yBuf;
  825.     uchar *uptr=uBuf;
  826.     uchar *vptr=vBuf;
  827.     ulong xi, yi, skip;
  828.     for (yi=0; yi<8; yi++) {
  829.       uchar *ip=iptr;
  830.       uchar *yp=yptr;
  831.       uchar *up=uptr;
  832.       uchar *vp=vptr;
  833.       long re=0, ge=0, be=0;
  834.       if (height<=0) return;
  835.       xi=width;
  836.       skip=0;
  837.       while (xi--) {
  838.         ulong u0=*up++;
  839.         ulong v0=*vp++;
  840.         long cr=vrTab[v0];
  841.         long cg=vgTab[v0]+ugTab[u0];
  842.         long cb=ubTab[u0];
  843.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  844.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  845.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  846.         DecYUV332Dith(*ip++,*yp++,cr,cg,cb);
  847.         mcu4hInnerTail(56,56);
  848.       }
  849.       yptr+=8;
  850.       uptr+=8;
  851.       vptr+=8;
  852.       height--;
  853.       iptr+=ipSize;
  854.     }
  855.     yBuf+=rowSize<<2;
  856.     uBuf+=rowSize;
  857.     vBuf+=rowSize;
  858.   }
  859. }
  860. /* \\\ */
  861.  
  862. /* /// "jpg_read_SOI()" */
  863. ulong jpg_read_SOI()
  864. {
  865.   // DEBUG_LEVEL1 kprintf("SOI: \n");
  866.   jpg_rst_interval = 0;
  867.   return(xaTRUE);
  868. }
  869. /* \\\ */
  870.  
  871. /* /// "jpg_read_SOF()" */
  872. ulong jpg_read_SOF()
  873. {
  874.   long len,ci;
  875.   COMPONENT_HDR *comp;
  876.   
  877.   JJ_INPUT_xaSHORT(len);
  878.   if (xa_mjpg_kludge) len -= 6;
  879.   else len -= 8;
  880.  
  881.   JJ_INPUT_xaBYTE(jpg_dprec);
  882.   JJ_INPUT_xaSHORT(jpg_height);
  883.   JJ_INPUT_xaSHORT(jpg_width);
  884.   JJ_INPUT_xaBYTE(jpg_num_comps);
  885.  
  886.   // DEBUG_LEVEL1 kprintf("SOF: dprec %x res %d x %d comps %x\n",jpg_dprec,jpg_width,jpg_height,jpg_num_comps);
  887.  
  888.   for(ci = 0; ci < jpg_num_comps; ci++)
  889.   { ulong c;
  890.     if (ci > JPG_MAX_COMPS)     comp = &jpg_comps[JPG_DUMMY_COMP];
  891.     else                        comp = &jpg_comps[ci];
  892.     JJ_INPUT_xaBYTE(comp->id);
  893.     JJ_INPUT_xaBYTE(c);
  894.     comp->hvsample = c;
  895.     JJ_INPUT_xaBYTE(comp->qtbl_num);
  896.     // DEBUG_LEVEL1 kprintf("   id %x hvsamp %x qtbl %x\n",comp->id,c,comp->qtbl_num);
  897.   }
  898.   return (ulong)(JJ_INPUT_CHECK(0));
  899. }
  900. /* \\\ */
  901.  
  902. /* /// "jpg_read_SOS()" */
  903. ulong jpg_read_SOS()
  904. { long len,i;
  905.   long jpg_Ss, jpg_Se, jpg_AhAl;
  906.  
  907.   JJ_INPUT_xaSHORT(len);
  908.   /* if (xa_mjpg_kludge) len += 2; length ignored */
  909.  
  910.   JJ_INPUT_xaBYTE(jpg_comps_in_scan);
  911.  
  912.   for (i = 0; i < jpg_comps_in_scan; i++)
  913.   { long j,comp_id,htbl_num;
  914.     COMPONENT_HDR *comp = 0;
  915.  
  916.     JJ_INPUT_xaBYTE(comp_id);
  917.     j = 0;
  918.     while(j < jpg_num_comps)
  919.     { comp = &jpg_comps[j];
  920.       if (comp->id == comp_id) break;
  921.       j++;
  922.     }
  923.     if (j > jpg_num_comps) {
  924.       // kprintf("JJ: bad id %x",comp_id);
  925.       return(xaFALSE);
  926.     }
  927.  
  928.     JJ_INPUT_xaBYTE(htbl_num);
  929.     comp->dc_htbl_num = (htbl_num >> 4) & 0x0f;
  930.     comp->ac_htbl_num = (htbl_num     ) & 0x0f;
  931.     // DEBUG_LEVEL1 kprintf("     id %x dc/ac %x\n",comp_id,htbl_num);
  932.   }
  933.   JJ_INPUT_xaBYTE(jpg_Ss);
  934.   JJ_INPUT_xaBYTE(jpg_Se);
  935.   JJ_INPUT_xaBYTE(jpg_AhAl);
  936.   return (ulong)(JJ_INPUT_CHECK(0));
  937. }
  938. /* \\\ */
  939.  
  940. /* /// "jpg_read_DQT()" */
  941. ulong jpg_read_DQT()
  942. { long len;
  943.   JJ_INPUT_xaSHORT(len);
  944.   if ( !xa_mjpg_kludge ) len -= 2;
  945.  
  946.   // DEBUG_LEVEL1 kprintf("DQT:\n");
  947.  
  948.   while(len > 0)
  949.   { long i,tbl_num,prec;
  950.     long *quant_table;
  951.  
  952.     JJ_INPUT_xaBYTE(tbl_num);  len -= 1;
  953.     // DEBUG_LEVEL1 kprintf("     prec/tnum %02x\n",tbl_num);
  954.  
  955.     prec = (tbl_num >> 4) & 0x0f;
  956.     prec = (prec)?(2 * DCTSIZE2):(DCTSIZE2);  /* 128 or 64 */
  957.     tbl_num &= 0x0f;
  958.     if (tbl_num > 4) {
  959.       // kprintf("JJ: bad DQT tnum %x\n",tbl_num);
  960.       return(xaFALSE);
  961.     }
  962.  
  963. /*
  964.     if (jpg_quant_tables[tbl_num] == 0)
  965.     {
  966.       jpg_quant_tables[tbl_num] = (long *)malloc(64 * sizeof(long));
  967.       if (jpg_quant_tables[tbl_num] == 0)
  968.         { kprintf("JJ: DQT alloc err %x \n",tbl_num); return(xaFALSE); }
  969.     }
  970. */
  971.     len -= prec;
  972.     if (JJ_INPUT_CHECK(prec)==xaFALSE) return(xaFALSE);
  973.     quant_table = jpg_quant_tables[tbl_num];
  974.     if (prec==128)
  975.     { ulong tmp;
  976.       for (i = 0; i < DCTSIZE2; i++)
  977.         { JJ_INPUT_xaSHORT(tmp); quant_table[ JJ_ZAG[i] ] = (long) tmp; }
  978.     }
  979.     else
  980.     { ulong tmp;
  981.       for (i = 0; i < DCTSIZE2; i++)
  982.         { JJ_INPUT_xaBYTE(tmp); quant_table[ JJ_ZAG[i] ] = (long) tmp; }
  983.     }
  984.   }
  985.   return(xaTRUE);
  986. }
  987. /* \\\ */
  988.  
  989. /* /// "jpg_read_DRI()" */
  990. ulong jpg_read_DRI()
  991. { long len;
  992.   JJ_INPUT_xaSHORT(len);
  993.   JJ_INPUT_xaSHORT(jpg_rst_interval);
  994.   // DEBUG_LEVEL1 kprintf("DRI: int %x\n",jpg_rst_interval);
  995.   return(xaTRUE);
  996. }
  997. /* \\\ */
  998.  
  999. /* /// "jpg_skip_marker()" */
  1000. ulong jpg_skip_marker()
  1001. { long len,tmp;
  1002.   JJ_INPUT_xaSHORT(len); 
  1003.   // DEBUG_LEVEL1 kprintf("SKIP: marker %x len %x\n",jpg_marker,len);
  1004.   len -= 2; if (JJ_INPUT_CHECK(len)==xaFALSE) return(xaFALSE);
  1005.   while(len--) JJ_INPUT_xaBYTE(tmp); /* POD improve this */
  1006.   return(xaTRUE);
  1007. }
  1008. /* \\\ */
  1009.  
  1010. /* /// "jpg_read_DHT()" */
  1011. ulong jpg_read_DHT()
  1012. {
  1013.   long len;
  1014.   JJ_HUFF_TBL *htable;
  1015.   uchar  *hbits;
  1016.   uchar  *hvals;
  1017.  
  1018.   jpg_std_DHT_flag = 0;
  1019.   JJ_INPUT_xaSHORT(len);
  1020.   if (xa_mjpg_kludge) len += 2;
  1021.   len -= 2;
  1022.   if (JJ_INPUT_CHECK(len)==xaFALSE) return(xaFALSE);
  1023.  
  1024.   while(len > 0)
  1025.   { long i,index,count;
  1026.     JJ_INPUT_xaBYTE(index);
  1027.     /* POD index check */
  1028.     if (index & 0x10)                           /* AC Table */
  1029.     {
  1030.       index &= 0x0f;
  1031.       htable = &(jpg_ac_huff[index]);
  1032.       hbits  = jpg_ac_huff[index].bits;
  1033.       hvals  = jpg_ac_huff[index].vals;
  1034.     }
  1035.     else                                        /* DC Table */
  1036.     {
  1037.       htable = &(jpg_dc_huff[index]);
  1038.       hbits  = jpg_dc_huff[index].bits;
  1039.       hvals  = jpg_dc_huff[index].vals;
  1040.     }
  1041.     hbits[0] = 0;               count = 0;
  1042.     for (i = 1; i <= 16; i++)
  1043.     {
  1044.       JJ_INPUT_xaBYTE(hbits[i]);
  1045.       count += hbits[i];
  1046.     }
  1047.     len -= 17;
  1048.     if (count > 256) {
  1049.       // kprintf("JJ: DHT bad count %d\n",count);
  1050.       return(xaFALSE);
  1051.     }
  1052.  
  1053.     for (i = 0; i < count; i++) JJ_INPUT_xaBYTE(hvals[i]);
  1054.     len -= count;
  1055.  
  1056.     jpg_huff_build(htable,hbits,hvals);
  1057.  
  1058.   } /* end of len */
  1059.   return(xaTRUE);
  1060. }
  1061. /* \\\ */
  1062.  
  1063. /* /// "jpg_get_marker()" */
  1064. ulong jpg_get_marker()
  1065. {
  1066.   long c;
  1067.  
  1068.   for(;;)
  1069.   {
  1070.     JJ_INPUT_xaBYTE(c);
  1071.     while(c != 0xFF)    /* look for FF */
  1072.     {
  1073.       if (JJ_INPUT_CHECK(1)==xaFALSE) return(xaFALSE);
  1074.       JJ_INPUT_xaBYTE(c);
  1075.     }
  1076.     /* now we've got 1 0xFF, keep reading until next 0xFF */
  1077.     do
  1078.     {
  1079.       if (JJ_INPUT_CHECK(1)==xaFALSE) return(xaFALSE);
  1080.       JJ_INPUT_xaBYTE(c);
  1081.     } while (c == 0xFF);
  1082.     if (c != 0) break; /* ignore FF/00 sequences */
  1083.   }
  1084.   jpg_marker = c;
  1085.   return(xaTRUE);
  1086. }
  1087. /* \\\ */
  1088.  
  1089. /* /// "jpg_read_markers()" */
  1090. ulong jpg_read_markers()
  1091. {
  1092.   for(;;)
  1093.   { 
  1094.     if (jpg_get_marker() == xaFALSE) return(xaFALSE);
  1095.     // DEBUG_LEVEL1 kprintf("JJ: marker %x\n",jpg_marker);
  1096.     switch(jpg_marker)
  1097.     {
  1098.       case M_SOI: 
  1099.         if (jpg_read_SOI()==xaFALSE) return(xaFALSE);
  1100.         jpg_saw_SOI = xaTRUE;
  1101.         break;
  1102.       case M_SOF0: 
  1103.       case M_SOF1: 
  1104.         if (jpg_read_SOF()==xaFALSE) return(xaFALSE);
  1105.         jpg_saw_SOF = xaTRUE;
  1106.         break;
  1107.       case M_SOS: 
  1108.         if (jpg_read_SOS()==xaFALSE) return(xaFALSE);
  1109.         jpg_saw_SOS = xaTRUE;
  1110.         jpg_nxt_rst_num = 0;
  1111.         return(xaTRUE);
  1112.         break;
  1113.       case M_DHT:
  1114.         if (jpg_read_DHT()==xaFALSE) return(xaFALSE);
  1115.         jpg_saw_DHT = xaTRUE;
  1116.         break;
  1117.       case M_DQT:
  1118.         if (jpg_read_DQT()==xaFALSE) return(xaFALSE);
  1119.         jpg_saw_DQT = xaTRUE;
  1120.         break;
  1121.       case M_DRI:
  1122.         if (jpg_read_DRI()==xaFALSE) return(xaFALSE);
  1123.         break;
  1124.       case M_EOI:
  1125.         // kprintf("JJ: reached EOI without data\n");
  1126.         return(xaFALSE);
  1127.         break;
  1128.      case M_RST0:                /* these are all parameterless */
  1129.      case M_RST1:
  1130.      case M_RST2:
  1131.      case M_RST3:
  1132.      case M_RST4:
  1133.      case M_RST5:
  1134.      case M_RST6:
  1135.      case M_RST7:
  1136.      case M_TEM:
  1137.         break;
  1138.       default:
  1139.         if (jpg_skip_marker()==xaFALSE) return(xaFALSE);
  1140.         // DEBUG_LEVEL1 kprintf("JJ: skipped marker %x\n",jpg_marker);
  1141.         break;
  1142.     } /* end of switch */
  1143.   } /* end of forever */
  1144. }
  1145. /* \\\ */
  1146.  
  1147. /* /// "jpg_huff_build()" */
  1148. void jpg_huff_build(JJ_HUFF_TBL *htbl, uchar *hbits, uchar *hvals)
  1149. { ulong clen,num_syms,p,i,si,code,lookbits;
  1150.   ulong l,ctr;
  1151.   uchar huffsize[257];
  1152.   ulong huffcode[257];
  1153.  
  1154.   /*** generate code lengths for each symbol */
  1155.   num_syms = 0;
  1156.   for(clen = 1; clen <= 16; clen++)
  1157.   {
  1158.     for(i = 1; i <= (ulong)(hbits[clen]); i++)
  1159.                                 huffsize[num_syms++] = (uchar)(clen);
  1160.   }
  1161.   huffsize[num_syms] = 0;
  1162.  
  1163.   /*** generate codes */
  1164.   code = 0;
  1165.   si = huffsize[0];
  1166.   p = 0;
  1167.   while (huffsize[p])
  1168.   {
  1169.     while ( ((ulong)huffsize[p]) == si)
  1170.     {
  1171.       huffcode[p++] = code;
  1172.       code++;
  1173.     }
  1174.     code <<= 1;
  1175.     si++;
  1176.   }
  1177.  
  1178. /* Init mincode/maxcode/valptr arrays */
  1179.   p = 0;
  1180.   for (l = 1; l <= 16; l++) 
  1181.   {
  1182.     if (htbl->bits[l]) 
  1183.     {
  1184.       htbl->valptr[l] = p; /* huffval[] index of 1st symbol of code length l */
  1185.       htbl->mincode[l] = huffcode[p]; /* minimum code of length l */
  1186.       p += (ulong)(htbl->bits[l]);
  1187.       htbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
  1188.     } 
  1189.     else
  1190.     {
  1191.       htbl->valptr[l] = 0;  /* not needed */
  1192.       htbl->mincode[l] = 0; /* not needed */
  1193.       htbl->maxcode[l] = 0; /* WAS -1; */   /* -1 if no codes of this length */
  1194.     }
  1195.   }
  1196.   htbl->maxcode[17] = 0xFFFFFL; /* ensures huff_DECODE terminates */
  1197.  
  1198.  
  1199. /* Init huffman cache */
  1200.   // memset((char *)htbl->cache, 0, ((1<<HUFF_LOOKAHEAD) * sizeof(xaUSHORT)) );
  1201.   // for (p=0; p<(1<<HUFF_LOOKAHEAD); p++) htbl->cache[p]=0;
  1202.   mymemset((ulong *)htbl->cache, 0, ((1<<HUFF_LOOKAHEAD) * sizeof(ushort)) );
  1203.  
  1204.   p = 0;
  1205.   for (l = 1; l <= HUFF_LOOKAHEAD; l++) 
  1206.   {
  1207.     for (i = 1; i <= (ulong) htbl->bits[l]; i++, p++)
  1208.     { short the_code = (ushort)((l << 8) | htbl->vals[p]);
  1209.  
  1210.       /* l = current code's length, p = its index in huffcode[] & huffval[]. */
  1211.       /* Generate left-justified code followed by all possible bit sequences */
  1212.  
  1213.       lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
  1214.       for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) 
  1215.       {
  1216.         htbl->cache[lookbits] = the_code;
  1217.         lookbits++;
  1218.       }
  1219.     }
  1220.   }
  1221. }
  1222. /* \\\ */
  1223.  
  1224. /* /// "jpg_init_input()" */
  1225. void jpg_init_input(uchar *buff, long buff_size)
  1226. {
  1227.   jpg_buff = buff;
  1228.   jpg_bsize = buff_size;
  1229. }
  1230. /* \\\ */
  1231.  
  1232. /* /// "jpg_huff_reset()" */
  1233. void jpg_huff_reset()
  1234. {
  1235.   jpg_comps[0].dc = 0;
  1236.   jpg_comps[1].dc = 0;
  1237.   jpg_comps[2].dc = 0;
  1238.   jpg_h_bbuf = 0;  /* clear huffman bit buffer */
  1239.   jpg_h_bnum = 0;
  1240. }
  1241. /* \\\ */
  1242.  
  1243. /* /// "jpg_read_EOI_marker()" */
  1244. ulong jpg_read_EOI_marker()
  1245.   /* POD make sure previous code restores bit buffer to input stream */ 
  1246.   while( jpg_get_marker() == xaTRUE)
  1247.   {
  1248.     if (jpg_marker == M_EOI) {jpg_saw_EOI = xaTRUE; return(xaTRUE); }
  1249.   }
  1250.   return(xaFALSE);
  1251. }
  1252. /* \\\ */
  1253.  
  1254. /* /// "jpg_read_RST_marker()" */
  1255. ulong jpg_read_RST_marker()
  1256. {
  1257.   if ( (jpg_marker >= M_RST0) && (jpg_marker <= M_RST7) ) 
  1258.   {
  1259.     // DEBUG_LEVEL1 kprintf("JJ: RST marker %x found\n",jpg_marker);
  1260.     return(xaTRUE);
  1261.   }
  1262.   else
  1263.   {
  1264.     // kprintf("JJ: NON-restart marker found %x\n",jpg_marker);
  1265.     // kprintf("JJ: should resync-to-restart\n");
  1266.   }
  1267.   return(xaTRUE); /* POD NOTE just for now */
  1268. }
  1269. /* \\\ */
  1270.  
  1271. /* /// "define's" */
  1272. #define jpg_huff_EXTEND(val,sz) ((val) < (1<<((sz)-1)) ? (val) + (((-1)<<(sz)) + 1) : (val))
  1273.  
  1274. #define JJ_HBBUF_FILL8(hbbuf,hbnum) { \
  1275.   register ulong _tmp;                \
  1276.   hbbuf <<= 8;                        \
  1277.   if (jpg_marker)                     \
  1278.     return(xaFALSE);                  \
  1279.   else                                \
  1280.     JJ_INPUT_xaBYTE(_tmp);            \
  1281.   while(_tmp == 0xff) {               \
  1282.     register ulong _t1;               \
  1283.     JJ_INPUT_xaBYTE(_t1);             \
  1284.     if (_t1 == 0x00)                  \
  1285.       break;                          \
  1286.     else                              \
  1287.       if (_t1 == 0xff)                \
  1288.         continue;                     \
  1289.       else {                          \
  1290.         jpg_marker = _t1;             \
  1291.         _tmp = 0x00;                  \
  1292.         break;                        \
  1293.       }                               \
  1294.   }                                   \
  1295.   hbbuf |= _tmp;                      \
  1296.   hbnum += 8;                         \
  1297. }
  1298.  
  1299. #define JJ_HBBUF_FILL8_1(hbbuf,hbnum) { \
  1300.   register ulong __tmp;                 \
  1301.   hbbuf <<= 8;                          \
  1302.   hbnum += 8;                           \
  1303.   if (jpg_marker)                       \
  1304.     __tmp = 0x00;                       \
  1305.   else                                  \
  1306.     JJ_INPUT_xaBYTE(__tmp);             \
  1307.   while(__tmp == 0xff) {                \
  1308.     register ulong _t1;                 \
  1309.     JJ_INPUT_xaBYTE(_t1);               \
  1310.     if (_t1 == 0x00)                    \
  1311.       break;                            \
  1312.     else                                \
  1313.       if (_t1 == 0xff)                  \
  1314.         continue;                       \
  1315.       else {                            \
  1316.         jpg_marker = _t1;               \
  1317.         __tmp = 0x00;                   \
  1318.         break;                          \
  1319.       }                                 \
  1320.   }                                     \
  1321.   hbbuf |= __tmp;                       \
  1322. }
  1323.  
  1324. #define JJ_HUFF_DECODE(huff_hdr,htbl, hbnum, hbbuf, result) {           \
  1325.   register ulong _tmp, _hcode;                                          \
  1326.   while(hbnum < 16) JJ_HBBUF_FILL8_1(hbbuf,hbnum);                      \
  1327.   _tmp = (hbbuf >> (hbnum - 8)) & 0xff;                                 \
  1328.   _hcode = (htbl)[_tmp];                                                \
  1329.   if (_hcode) {                                                         \
  1330.     hbnum -= (_hcode >> 8);                                             \
  1331.     (result) = _hcode & 0xff;                                           \
  1332.   } else {                                                              \
  1333.     register ulong _hcode, _shift, _minbits = 9;                        \
  1334.     _tmp = (hbbuf >> (hbnum - 16)) & 0xffff; /* get 16 bits */          \
  1335.     _shift = 16 - _minbits;                                             \
  1336.     _hcode = _tmp >> _shift;                                            \
  1337.     while(_hcode > huff_hdr->maxcode[_minbits]) {                       \
  1338.       _minbits++;                                                       \
  1339.       _shift--;                                                         \
  1340.       _hcode = _tmp >> _shift;                                          \
  1341.     }                                                                   \
  1342.     if (_minbits > 16) {                                                \
  1343.       /* kprintf("JHDerr\n"); */                                        \
  1344.       return(xaFALSE);                                                  \
  1345.     } else {                                                            \
  1346.       hbnum -= _minbits;                                                \
  1347.       _hcode -= huff_hdr->mincode[_minbits];                            \
  1348.       result = huff_hdr->vals[ (huff_hdr->valptr[_minbits] + _hcode) ]; \
  1349.     }                                                                   \
  1350.   }                                                                     \
  1351. }
  1352.  
  1353. #define JJ_HUFF_MASK(s) ((1 << (s)) - 1)
  1354.  
  1355. #define JJ_GET_BITS(n, hbnum, hbbuf, result) {     \
  1356.   hbnum -= n;                                      \
  1357.   while(hbnum < 0) JJ_HBBUF_FILL8_1(hbbuf,hbnum);  \
  1358.   (result) = ((hbbuf >> hbnum) & JJ_HUFF_MASK(n)); \
  1359. }
  1360. /* \\\ */
  1361.  
  1362. /* /// "jpg_huffparse()" */
  1363. ulong jpg_huffparse(register COMPONENT_HDR *comp, register short *dct_buf, ulong *qtab, uchar *OBuf)
  1364. { long i,dcval;
  1365.   ulong size;
  1366.   JJ_HUFF_TBL *huff_hdr = &(jpg_dc_huff[ comp->dc_htbl_num ]);
  1367.   ushort *huff_tbl = huff_hdr->cache;
  1368.   uchar *limit = rngLimit + (CENTERJSAMPLE); // + MAXJSAMPLE + 1);
  1369.   ulong c_cnt,pos = 0;
  1370.  
  1371.   JJ_HUFF_DECODE(huff_hdr,huff_tbl,jpg_h_bnum,jpg_h_bbuf,size);
  1372.  
  1373.   // DEBUG_LEVEL2 kprintf(" HUFF DECODE: size %d\n",size);
  1374.  
  1375.   if (size)
  1376.   { ulong bits;
  1377.     JJ_GET_BITS(size,jpg_h_bnum,jpg_h_bbuf,bits);
  1378.     dcval = jpg_huff_EXTEND(bits, size);
  1379.     comp->dc += dcval;
  1380.     // DEBUG_LEVEL2 kprintf("   dcval %d  -dc %d\n",dcval,comp->dc);
  1381.   }
  1382.   dcval = comp->dc;
  1383.  
  1384.   /* clear reset of dct buffer */
  1385.   // memset((char *)(dct_buf),0,(DCTSIZE2 * sizeof(short)));
  1386.   // for (i=0; i<DCTSIZE2; i++) dct_buf[i]=0;
  1387.   mymemset((ulong *)(dct_buf),0,(DCTSIZE2 * sizeof(short)));
  1388.  
  1389.   dcval *= (long)qtab[0];
  1390.   dct_buf[0] = (short)dcval;
  1391.   c_cnt = 0;
  1392.  
  1393.   huff_hdr = &(jpg_ac_huff[ comp->ac_htbl_num ]);
  1394.   huff_tbl = huff_hdr->cache;
  1395.   i = 1;
  1396.   while(i < 64)
  1397.   { long level;       ulong run,tmp;
  1398.     JJ_HUFF_DECODE(huff_hdr,huff_tbl,jpg_h_bnum,jpg_h_bbuf,tmp); 
  1399.     size =  tmp & 0x0f;
  1400.     run = (tmp >> 4) & 0x0f; /* leading zeroes */
  1401.     // DEBUG_LEVEL2 kprintf("     %d) tmp %x size %x run %x\n",i,tmp,size,run);
  1402.     if (size)
  1403.     { long coeff;
  1404.       i += run; /* skip zeroes */
  1405.       JJ_GET_BITS(size, jpg_h_bnum,jpg_h_bbuf,level);
  1406.       coeff = (long)jpg_huff_EXTEND(level, size);
  1407.       // DEBUG_LEVEL2 kprintf("                   size %d coeff %x\n",size,coeff);
  1408.       pos = JJ_ZAG[i];
  1409.       coeff *= (long)qtab[ pos ];
  1410.       if (coeff)
  1411.       { c_cnt++;
  1412.         dct_buf[ pos ] = (short)(coeff);
  1413.       }
  1414.       i++;
  1415.     }
  1416.     else
  1417.     {
  1418.       if (run != 15) break; /* EOB */
  1419.       i += 16;
  1420.     }
  1421.   }
  1422.  
  1423.   if (c_cnt) j_rev_dct(dct_buf, OBuf, limit);
  1424.   else
  1425.   { register uchar *op = OBuf;
  1426.     register int jj = 8;
  1427.     short v = *dct_buf;
  1428.     register uchar dc;
  1429.     v = (v < 0)?( (v-3)>>3 ):( (v+4)>>3 );
  1430.     dc = limit[ (int) (v & RANGE_MASK) ];
  1431.     while(jj--)
  1432.     { op[0] = op[1] = op[2] = op[3] = op[4] = op[5] = op[6] = op[7] = dc;
  1433.       op += 8;
  1434.     }
  1435.   }
  1436.   return(xaTRUE);
  1437. }
  1438. /* \\\ */
  1439.  
  1440. /* /// "jpg_std_DHT()" */
  1441. ulong jpg_std_DHT()
  1442. {
  1443.   long ttt,len;
  1444.   JJ_HUFF_TBL *htable;
  1445.   uchar  *hbits,*Sbits;
  1446.   uchar  *hvals,*Svals;
  1447.  
  1448.   static uchar dc_luminance_bits[17] =
  1449.     { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
  1450.   static uchar dc_luminance_vals[] =
  1451.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  1452.  
  1453.   static uchar dc_chrominance_bits[17] =
  1454.     { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
  1455.   static uchar dc_chrominance_vals[] =
  1456.     { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
  1457.  
  1458.   static uchar ac_luminance_bits[17] =
  1459.     { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
  1460.   static uchar ac_luminance_vals[] =
  1461.     { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
  1462.       0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
  1463.       0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
  1464.       0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
  1465.       0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
  1466.       0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
  1467.       0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
  1468.       0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
  1469.       0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
  1470.       0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
  1471.       0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
  1472.       0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
  1473.       0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
  1474.       0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
  1475.       0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
  1476.       0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
  1477.       0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
  1478.       0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
  1479.       0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
  1480.       0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  1481.       0xf9, 0xfa };
  1482.  
  1483.   static uchar ac_chrominance_bits[17] =
  1484.     { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
  1485.   static uchar ac_chrominance_vals[] =
  1486.     { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
  1487.       0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
  1488.       0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
  1489.       0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
  1490.       0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
  1491.       0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
  1492.       0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
  1493.       0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
  1494.       0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
  1495.       0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
  1496.       0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
  1497.       0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  1498.       0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
  1499.       0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
  1500.       0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
  1501.       0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
  1502.       0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
  1503.       0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
  1504.       0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
  1505.       0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
  1506.       0xf9, 0xfa };
  1507.  
  1508.   for(ttt=0;ttt<4;ttt++)
  1509.   { ulong index = ttt & 1;
  1510.     long i,count;
  1511.  
  1512.     if (ttt <= 1)  /* DC tables */ 
  1513.     {
  1514.       htable = &(jpg_dc_huff[index]);
  1515.       hbits  = jpg_dc_huff[index].bits;
  1516.       hvals  = jpg_dc_huff[index].vals;
  1517.         if (index==0) { Sbits = dc_luminance_bits; Svals = dc_luminance_vals; }
  1518.         else { Sbits = dc_chrominance_bits; Svals = dc_chrominance_vals; }
  1519.     }
  1520.     else /* AC tables */
  1521.     {
  1522.       htable = &(jpg_ac_huff[index]);
  1523.       hbits  = jpg_ac_huff[index].bits;
  1524.       hvals  = jpg_ac_huff[index].vals;
  1525.         if (index==0) { Sbits = ac_luminance_bits; Svals = ac_luminance_vals; }
  1526.         else { Sbits = ac_chrominance_bits; Svals = ac_chrominance_vals; }
  1527.     }
  1528.     hbits[0] = 0;               count = 0;
  1529.     for (i = 1; i <= 16; i++)
  1530.     {
  1531.       hbits[i] = Sbits[i];
  1532.       count += hbits[i];
  1533.     }
  1534.     // len -= 17;
  1535.     if (count > 256) {
  1536.       // kprintf("JJ: STD DHT bad count %d\n",count);
  1537.       return(xaFALSE);
  1538.     }
  1539.  
  1540.     for (i = 0; i < count; i++) hvals[i] = Svals[i];
  1541.     // len -= count;
  1542.  
  1543.     jpg_huff_build(htable,hbits,hvals);
  1544.  
  1545.   } /* end of i */
  1546.   jpg_std_DHT_flag = 1;
  1547.   return(xaTRUE);
  1548. }
  1549. /* \\\ */
  1550.  
  1551. /* /// "jpg_search_marker()" */
  1552. ulong jpg_search_marker(ulong marker, uchar **data_ptr, long *data_size)
  1553. { ulong d = 0;
  1554.   uchar *dptr = *data_ptr;
  1555.   long dsize = *data_size;
  1556.  
  1557.   while( dsize )
  1558.   {
  1559.     if (d == 0xff) /* potential marker */
  1560.     {
  1561.       d = *dptr++; dsize--;
  1562.       if (d == marker) 
  1563.       {
  1564.         *data_size = dsize; *data_ptr = dptr;   
  1565.         return(xaTRUE); /* found marker */
  1566.       }
  1567.     } else { d = *dptr++; dsize--; }
  1568.   }
  1569.   *data_size = dsize; *data_ptr = dptr;         
  1570.   return(xaFALSE);
  1571. }
  1572. /* \\\ */
  1573.  
  1574. /* /// "Tabellen und define's" */
  1575. char std_luminance_quant_tbl[64] = {
  1576.   16,  11,  12,  14,  12,  10,  16,  14,
  1577.   13,  14,  18,  17,  16,  19,  24,  40,
  1578.   26,  24,  22,  22,  24,  49,  35,  37,
  1579.   29,  40,  58,  51,  61,  60,  57,  51,
  1580.   56,  55,  64,  72,  92,  78,  64,  68,
  1581.   87,  69,  55,  56,  80, 109,  81,  87,
  1582.   95,  98, 103, 104, 103,  62,  77, 113,
  1583.  121, 112, 100, 120,  92, 101, 103,  99
  1584. };
  1585.  
  1586. char std_chrominance_quant_tbl[64] = {
  1587.   17,  18,  18,  24,  21,  24,  47,  26,
  1588.   26,  47,  99,  66,  56,  66,  99,  99,
  1589.   99,  99,  99,  99,  99,  99,  99,  99,
  1590.   99,  99,  99,  99,  99,  99,  99,  99,
  1591.   99,  99,  99,  99,  99,  99,  99,  99,
  1592.   99,  99,  99,  99,  99,  99,  99,  99,
  1593.   99,  99,  99,  99,  99,  99,  99,  99,
  1594.   99,  99,  99,  99,  99,  99,  99,  99
  1595. };
  1596.  
  1597. #define JPG_HANDLE_RST(rst_int,rst_cnt) {                                       \
  1598.   if ( ((rst_int) && (rst_cnt==0)) /* || (jpg_marker)*/ ) {                     \
  1599.     jpg_h_bbuf = 0;                                                             \
  1600.     jpg_h_bnum = 0;                                                             \
  1601.     /* DEBUG_LEVEL1 kprintf("  jRST_INT %d rst_cnt %d\n", rst_int,rst_cnt); */  \
  1602.     if (jpg_marker) {                                                           \
  1603.       /* DEBUG_LEVEL1 kprintf("  jpg_marker(%x)\n",jpg_marker); */              \
  1604.       if (jpg_marker == M_EOI) {                                                \
  1605.         jpg_saw_EOI = xaTRUE;                                                   \
  1606.         return(xaTRUE);                                                         \
  1607.       } else                                                                    \
  1608.         if ( !((jpg_marker >= M_RST0) && (jpg_marker <= M_RST7))) {             \
  1609.           /* kprintf("JPEG: unexp marker(%x)\n",jpg_marker); */                 \
  1610.           return(xaFALSE);                                                      \
  1611.         }                                                                       \
  1612.       jpg_marker = 0;                                                           \
  1613.     } else                                                                      \
  1614.       if (jpg_read_RST_marker()==xaFALSE) {                                     \
  1615.         /* kprintf("RST marker false\n"); */                                    \
  1616.         return(xaFALSE);                                                        \
  1617.       }                                                                         \
  1618.       jpg_comps[0].dc = jpg_comps[1].dc = jpg_comps[2].dc = 0;                  \
  1619.       rst_cnt = rst_int;                                                        \
  1620.   } else                                                                        \
  1621.     rst_cnt--;                                                                  \
  1622. };
  1623.  
  1624. #define JPG_TST_MARKER(rst_int,rst_cnt) {                          \
  1625.   if (jpg_marker) {                                                \
  1626.     /* DEBUG_LEVEL1 kprintf("  jpg_marker(%x)\n",jpg_marker); */   \
  1627.     if (jpg_marker == M_EOI) {                                     \
  1628.       jpg_saw_EOI = xaTRUE;                                        \
  1629.       /* return(xaTRUE); */                                        \
  1630.      } else                                                        \
  1631.        if ( !((jpg_marker >= M_RST0) && (jpg_marker <= M_RST7))) { \
  1632.          /* kprintf("JPEG: unexp marker(%x)\n",jpg_marker); */     \
  1633.          return(xaFALSE);                                          \
  1634.        } else {                                                    \
  1635.          jpg_comps[0].dc = jpg_comps[1].dc = jpg_comps[2].dc = 0;  \
  1636.          rst_cnt = rst_int;                                        \
  1637.          jpg_marker = 0;                                           \
  1638.          jpg_h_bbuf = 0;                                           \
  1639.          jpg_h_bnum = 0;                                           \
  1640.        }                                                           \
  1641.   }                                                                \
  1642. };
  1643. /* \\\ */
  1644.  
  1645. /* /// "jpg_decode_111111()" */
  1646. ulong jpg_decode_111111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey, ulong xgray)
  1647. {
  1648.   uchar *iptr = image;
  1649.   ulong x,mcu_cols,mcu_rows;
  1650.   ulong *qtab0,*qtab1,*qtab2;
  1651.   uchar *Ybuf,*Ubuf,*Vbuf;
  1652.   ulong rst_count;
  1653.   ulong orow_size = imagex*bytes_pixel;
  1654.  
  1655.   if (row_offset) iptr += row_offset * orow_size;
  1656.   orow_size *= interleave;
  1657.   if (interleave == 2) imagey >>= 1;
  1658.  
  1659.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1660.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1661.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1662.  
  1663.   mcu_cols = (width  + 7) / 8;
  1664.   mcu_rows = (height + 7) / 8;
  1665.   // DEBUG_LEVEL1 kprintf("111111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1666.   jpg_marker = 0x00;
  1667.  
  1668.   rst_count = jpg_rst_interval;
  1669.   while(mcu_rows--)
  1670.   { 
  1671.     Ybuf = yuvBuf->yBuf; Ubuf = yuvBuf->uBuf; Vbuf = yuvBuf->vBuf;
  1672.     x = mcu_cols;
  1673.     while(x--)
  1674.     { 
  1675.       // DEBUG_LEVEL1 kprintf("  MCU XY(%d,%d)\n",x,mcu_rows);
  1676.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1677.  
  1678.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1679.       if (gray==0)
  1680.       {
  1681.         jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1682.         jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1683.       } 
  1684.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1685.     } /* end of mcu_cols */
  1686.  
  1687.     // DEBUG_LEVEL1 kprintf("imagey %d\n",imagey);
  1688.     // (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size, &jpg_YUVBufs,&def_yuv_tabs, map_flag,map,chdr);
  1689.     if (xgray) MCU111111toGray(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size);
  1690.     else       mcu111111(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size);
  1691.     imagey -= 8;  iptr += (orow_size << 3);
  1692.  
  1693.   } /* end of mcu_rows */
  1694.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1695.   return(xaTRUE);
  1696. }
  1697. /* \\\ */
  1698.  
  1699. /* /// "jpg_decode_211111()" */
  1700. ulong jpg_decode_211111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey)
  1701. {
  1702.   uchar *iptr = image;
  1703.   ulong x,mcu_cols,mcu_rows;
  1704.   ulong *qtab0,*qtab1,*qtab2;
  1705.   uchar *Ybuf,*Ubuf,*Vbuf;
  1706.   ulong rst_count;
  1707.   ulong orow_size = imagex*bytes_pixel;
  1708.  
  1709.   if (row_offset) iptr += row_offset * orow_size;
  1710.   orow_size *= interleave;
  1711.   if (interleave == 2) imagey >>= 1;
  1712.   imagex++; imagex >>= 1;
  1713.  
  1714.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1715.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1716.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1717.  
  1718.   mcu_cols = (width  + 15) / 16;
  1719.   mcu_rows = (height +  7) / 8;
  1720.   // DEBUG_LEVEL1 kprintf("211111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1721.   jpg_marker = 0x00;
  1722.  
  1723.   rst_count = jpg_rst_interval;
  1724.   while(mcu_rows--)
  1725.   { 
  1726.     Ybuf = yuvBuf->yBuf; Ubuf = yuvBuf->uBuf; Vbuf = yuvBuf->vBuf;
  1727.     x = mcu_cols;
  1728.     while(x--)
  1729.     { /* DEBUG_LEVEL1 kprintf("MCU XY(%d,%d)\n", x,mcu_rows); */
  1730.  
  1731.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1732.  
  1733.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1734.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1735.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1736.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1737.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1738.     } /* end of mcu_cols */
  1739.  
  1740.     // (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size, &jpg_YUVBufs,&def_yuv_tabs, map_flag,map,chdr);
  1741.     mcu211111(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size);
  1742.     imagey -= 8;  iptr += (orow_size << 3);
  1743.  
  1744.   } /* end of mcu_rows */
  1745.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1746.   return(xaTRUE);
  1747. }
  1748. /* \\\ */
  1749.  
  1750. /* /// "jpg_decode_221111()" */
  1751. ulong jpg_decode_221111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey)
  1752. { uchar *iptr = image;
  1753.   long x,mcu_cols,mcu_rows;
  1754.   ulong *qtab0,*qtab1,*qtab2;
  1755.   uchar *Ybuf,*Ubuf,*Vbuf;
  1756.   ulong rst_count;
  1757.   ulong orow_size = imagex*bytes_pixel;
  1758.  
  1759.   if (row_offset) iptr += row_offset * orow_size;
  1760.   orow_size *= interleave;
  1761.   if (interleave == 2) imagey >>= 1;
  1762.   imagex++; imagex >>= 1;  /* 2h */
  1763.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1764.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1765.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1766.  
  1767.   mcu_cols = (width  + 15) / 16;
  1768.   mcu_rows = (height + 15) / 16;
  1769.   // DEBUG_LEVEL1 kprintf("221111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1770.   jpg_marker = 0x00;
  1771.  
  1772.   rst_count = jpg_rst_interval;
  1773.   while(mcu_rows--)
  1774.   { Ybuf = yuvBuf->yBuf; Ubuf = yuvBuf->uBuf; Vbuf = yuvBuf->vBuf;
  1775.     x = mcu_cols; while(x--)
  1776.     { // DEBUG_LEVEL1 kprintf("  MCU XY(%d,%d)\n",x,mcu_rows);
  1777.  
  1778.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1779.  
  1780.         /* Y0 Y1 Y2 Y3 U V */
  1781.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1782.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1783.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1784.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1785.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1786.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1787.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1788.     } /* end of mcu_cols */
  1789.  
  1790.     // (void)(color_func)(iptr,imagex,xaMIN(imagey,16),(mcu_cols * DCTSIZE2),orow_size,&jpg_YUVBufs,&def_yuv_tabs,map_flag,map,chdr);
  1791.     mcu221111(iptr,imagex,xaMIN(imagey,16),(mcu_cols * DCTSIZE2), orow_size);
  1792.     imagey -= 16;  iptr += (orow_size << 4);
  1793.  
  1794.   } /* end of mcu_rows */
  1795.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1796.   // DEBUG_LEVEL1 kprintf("411: done\n");
  1797.   return(xaTRUE);
  1798. }
  1799. /* \\\ */
  1800.  
  1801. /* /// "jpg_decode_411111()" */
  1802. ulong jpg_decode_411111(uchar *image, ulong width, ulong height, ulong interleave, ulong row_offset, ulong imagex, ulong imagey)
  1803. { uchar *iptr = image;
  1804.   long x,mcu_cols,mcu_rows;
  1805.   ulong *qtab0,*qtab1,*qtab2;
  1806.   uchar *Ybuf,*Ubuf,*Vbuf;
  1807.   ulong rst_count;
  1808.   ulong orow_size = imagex*bytes_pixel;
  1809.  
  1810.   if (row_offset) iptr += row_offset * orow_size;
  1811.   orow_size *= interleave;
  1812.   if (interleave == 2) imagey >>= 1;
  1813.   imagex +=3; imagex >>= 2; /* 4h */
  1814.   qtab0 = jpg_quant_tables[ jpg_comps[0].qtbl_num ];
  1815.   qtab1 = jpg_quant_tables[ jpg_comps[1].qtbl_num ];
  1816.   qtab2 = jpg_quant_tables[ jpg_comps[2].qtbl_num ];
  1817.  
  1818.   mcu_cols = (width  + 31) / 32;
  1819.   mcu_rows = (height + 7) / 8;
  1820.   // DEBUG_LEVEL1 kprintf("411111 begin MCUS(%d,%d)\n",mcu_cols,mcu_rows);
  1821.   jpg_marker = 0x00;
  1822.  
  1823.   rst_count = jpg_rst_interval;
  1824.   while(mcu_rows--)
  1825.   { Ybuf = yuvBuf->yBuf; Ubuf = yuvBuf->uBuf; Vbuf = yuvBuf->vBuf;
  1826.     x = mcu_cols; while(x--)
  1827.     { // DEBUG_LEVEL1 kprintf("  MCU XY(%d,%d)\n",x,mcu_rows);
  1828.  
  1829.       JPG_HANDLE_RST(jpg_rst_interval,rst_count);
  1830.  
  1831.         /* Y0 Y1 Y2 Y3 U V */
  1832.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1833.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1834.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1835.       jpg_huffparse(&jpg_comps[0],jpg_dct_buf,qtab0,Ybuf); Ybuf += DCTSIZE2;
  1836.       jpg_huffparse(&jpg_comps[1],jpg_dct_buf,qtab1,Ubuf); Ubuf += DCTSIZE2;
  1837.       jpg_huffparse(&jpg_comps[2],jpg_dct_buf,qtab2,Vbuf); Vbuf += DCTSIZE2;
  1838.       JPG_TST_MARKER(jpg_rst_interval,rst_count);
  1839.     } /* end of mcu_cols */
  1840.  
  1841.     // (void)(color_func)(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2),orow_size,&jpg_YUVBufs,&def_yuv_tabs,map_flag,map,chdr);
  1842.     mcu411111(iptr,imagex,xaMIN(imagey,8),(mcu_cols * DCTSIZE2), orow_size);
  1843.     imagey -= 8;  iptr += (orow_size << 3);
  1844.  
  1845.   } /* end of mcu_rows */
  1846.   if (jpg_marker) { jpg_h_bbuf = 0; jpg_h_bnum = 0; }
  1847.   // DEBUG_LEVEL1 kprintf("411: done\n");
  1848.   return(xaTRUE);
  1849. }
  1850. /* \\\ */
  1851.  
  1852. /* /// "j_rev_dct()" */
  1853. #ifdef RIGHT_SHIFT_IS_UNSIGNED
  1854. #define SHIFT_TEMPS     long shift_temp;
  1855. #define RIGHT_SHIFT(x,shft)  \
  1856.         ((shift_temp = (x)) < 0 ? \
  1857.          (shift_temp >> (shft)) | ((~((long) 0)) << (32-(shft))) : \
  1858.          (shift_temp >> (shft)))
  1859. #else
  1860. #define SHIFT_TEMPS
  1861. #define RIGHT_SHIFT(x,shft)     ((x) >> (shft))
  1862. #endif
  1863.  
  1864. #define PASS1_BITS  2
  1865.  
  1866. #define ONE     ((long) 1)
  1867.  
  1868. #define CONST_BITS 13
  1869.  
  1870. #define CONST_SCALE (ONE << CONST_BITS)
  1871.  
  1872. #define FIX(x)  ((long) ((x) * CONST_SCALE + 0.5))
  1873.  
  1874. #define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
  1875.  
  1876. #define MULTIPLY(var,const)  ((var) * (const))
  1877.  
  1878. void j_rev_dct (short *data, uchar *outptr, uchar *limit)
  1879. {
  1880.   long tmp0, tmp1, tmp2, tmp3;
  1881.   long tmp10, tmp11, tmp12, tmp13;
  1882.   long z1, z2, z3, z4, z5;
  1883.   long d0, d1, d2, d3, d4, d5, d6, d7;
  1884.   register short *dataptr;
  1885.   int rowctr;
  1886.   SHIFT_TEMPS
  1887.  
  1888.   /* Pass 1: process rows. */
  1889.   /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
  1890.   /* furthermore, we scale the results by 2**PASS1_BITS. */
  1891.  
  1892.   dataptr = data;
  1893.  
  1894.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--)
  1895.   {
  1896.     /* Due to quantization, we will usually find that many of the input
  1897.      * coefficients are zero, especially the AC terms.  We can exploit this
  1898.      * by short-circuiting the IDCT calculation for any row in which all
  1899.      * the AC terms are zero.  In that case each output is equal to the
  1900.      * DC coefficient (with scale factor as needed).
  1901.      * With typical images and quantization tables, half or more of the
  1902.      * row DCT calculations can be simplified this way.
  1903.      */
  1904.  
  1905.     register int *idataptr = (int*)dataptr;
  1906.     d0 = dataptr[0];
  1907.     d1 = dataptr[1];
  1908.     if ((d1 == 0) && (idataptr[1] | idataptr[2] | idataptr[3]) == 0) {
  1909.       /* AC terms all zero */
  1910.       if (d0) {
  1911.           /* Compute a 32 bit value to assign. */
  1912.           short dcval = (short) (d0 << PASS1_BITS);
  1913.           register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
  1914.  
  1915.           idataptr[0] = v;
  1916.           idataptr[1] = v;
  1917.           idataptr[2] = v;
  1918.           idataptr[3] = v;
  1919.       }
  1920.  
  1921.       dataptr += DCTSIZE;       /* advance pointer to next row */
  1922.       continue;
  1923.     }
  1924.     d2 = dataptr[2];
  1925.     d3 = dataptr[3];
  1926.     d4 = dataptr[4];
  1927.     d5 = dataptr[5];
  1928.     d6 = dataptr[6];
  1929.     d7 = dataptr[7];
  1930.  
  1931.     /* Even part: reverse the even part of the forward DCT. */
  1932.     /* The rotator is sqrt(2)*c(-6). */
  1933.     if (d6) {
  1934.         if (d4) {
  1935.             if (d2) {
  1936.                 if (d0) {
  1937.                     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  1938.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  1939.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  1940.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  1941.  
  1942.                     tmp0 = (d0 + d4) << CONST_BITS;
  1943.                     tmp1 = (d0 - d4) << CONST_BITS;
  1944.  
  1945.                     tmp10 = tmp0 + tmp3;
  1946.                     tmp13 = tmp0 - tmp3;
  1947.                     tmp11 = tmp1 + tmp2;
  1948.                     tmp12 = tmp1 - tmp2;
  1949.                 } else {
  1950.                     /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
  1951.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  1952.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  1953.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  1954.  
  1955.                     tmp0 = d4 << CONST_BITS;
  1956.  
  1957.                     tmp10 = tmp0 + tmp3;
  1958.                     tmp13 = tmp0 - tmp3;
  1959.                     tmp11 = tmp2 - tmp0;
  1960.                     tmp12 = -(tmp0 + tmp2);
  1961.                 }
  1962.             } else {
  1963.                 if (d0) {
  1964.                     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  1965.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  1966.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  1967.  
  1968.                     tmp0 = (d0 + d4) << CONST_BITS;
  1969.                     tmp1 = (d0 - d4) << CONST_BITS;
  1970.  
  1971.                     tmp10 = tmp0 + tmp3;
  1972.                     tmp13 = tmp0 - tmp3;
  1973.                     tmp11 = tmp1 + tmp2;
  1974.                     tmp12 = tmp1 - tmp2;
  1975.                 } else {
  1976.                     /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
  1977.                     tmp2 = MULTIPLY(d6, -FIX(1.306562965));
  1978.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  1979.  
  1980.                     tmp0 = d4 << CONST_BITS;
  1981.  
  1982.                     tmp10 = tmp0 + tmp3;
  1983.                     tmp13 = tmp0 - tmp3;
  1984.                     tmp11 = tmp2 - tmp0;
  1985.                     tmp12 = -(tmp0 + tmp2);
  1986.                 }
  1987.             }
  1988.         } else {
  1989.             if (d2) {
  1990.                 if (d0) {
  1991.                     /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
  1992.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  1993.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  1994.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  1995.  
  1996.                     tmp0 = d0 << CONST_BITS;
  1997.  
  1998.                     tmp10 = tmp0 + tmp3;
  1999.                     tmp13 = tmp0 - tmp3;
  2000.                     tmp11 = tmp0 + tmp2;
  2001.                     tmp12 = tmp0 - tmp2;
  2002.                 } else {
  2003.                     /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
  2004.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  2005.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  2006.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  2007.  
  2008.                     tmp10 = tmp3;
  2009.                     tmp13 = -tmp3;
  2010.                     tmp11 = tmp2;
  2011.                     tmp12 = -tmp2;
  2012.                 }
  2013.             } else {
  2014.                 if (d0) {
  2015.                     /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
  2016.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  2017.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2018.  
  2019.                     tmp0 = d0 << CONST_BITS;
  2020.  
  2021.                     tmp10 = tmp0 + tmp3;
  2022.                     tmp13 = tmp0 - tmp3;
  2023.                     tmp11 = tmp0 + tmp2;
  2024.                     tmp12 = tmp0 - tmp2;
  2025.                 } else {
  2026.                     /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
  2027.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  2028.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2029.  
  2030.                     tmp10 = tmp3;
  2031.                     tmp13 = -tmp3;
  2032.                     tmp11 = tmp2;
  2033.                     tmp12 = -tmp2;
  2034.                 }
  2035.             }
  2036.         }
  2037.     } else {
  2038.         if (d4) {
  2039.             if (d2) {
  2040.                 if (d0) {
  2041.                     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  2042.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2043.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2044.  
  2045.                     tmp0 = (d0 + d4) << CONST_BITS;
  2046.                     tmp1 = (d0 - d4) << CONST_BITS;
  2047.  
  2048.                     tmp10 = tmp0 + tmp3;
  2049.                     tmp13 = tmp0 - tmp3;
  2050.                     tmp11 = tmp1 + tmp2;
  2051.                     tmp12 = tmp1 - tmp2;
  2052.                 } else {
  2053.                     /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
  2054.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2055.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2056.  
  2057.                     tmp0 = d4 << CONST_BITS;
  2058.  
  2059.                     tmp10 = tmp0 + tmp3;
  2060.                     tmp13 = tmp0 - tmp3;
  2061.                     tmp11 = tmp2 - tmp0;
  2062.                     tmp12 = -(tmp0 + tmp2);
  2063.                 }
  2064.             } else {
  2065.                 if (d0) {
  2066.                     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  2067.                     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  2068.                     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  2069.                 } else {
  2070.                     /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
  2071.                     tmp10 = tmp13 = d4 << CONST_BITS;
  2072.                     tmp11 = tmp12 = -tmp10;
  2073.                 }
  2074.             }
  2075.         } else {
  2076.             if (d2) {
  2077.                 if (d0) {
  2078.                     /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
  2079.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2080.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2081.  
  2082.                     tmp0 = d0 << CONST_BITS;
  2083.  
  2084.                     tmp10 = tmp0 + tmp3;
  2085.                     tmp13 = tmp0 - tmp3;
  2086.                     tmp11 = tmp0 + tmp2;
  2087.                     tmp12 = tmp0 - tmp2;
  2088.                 } else {
  2089.                     /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
  2090.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2091.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2092.  
  2093.                     tmp10 = tmp3;
  2094.                     tmp13 = -tmp3;
  2095.                     tmp11 = tmp2;
  2096.                     tmp12 = -tmp2;
  2097.                 }
  2098.             } else {
  2099.                 if (d0) {
  2100.                     /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
  2101.                     tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
  2102.                 } else {
  2103.                     /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
  2104.                     tmp10 = tmp13 = tmp11 = tmp12 = 0;
  2105.                 }
  2106.             }
  2107.         }
  2108.     }
  2109.  
  2110.  
  2111.     /* Odd part per figure 8; the matrix is unitary and hence its
  2112.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  2113.      */
  2114.  
  2115.     if (d7) {
  2116.         if (d5) {
  2117.             if (d3) {
  2118.                 if (d1) {
  2119.                     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  2120.                     z1 = d7 + d1;
  2121.                     z2 = d5 + d3;
  2122.                     z3 = d7 + d3;
  2123.                     z4 = d5 + d1;
  2124.                     z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
  2125.  
  2126.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2127.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2128.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2129.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2130.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2131.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2132.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2133.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2134.  
  2135.                     z3 += z5;
  2136.                     z4 += z5;
  2137.  
  2138.                     tmp0 += z1 + z3;
  2139.                     tmp1 += z2 + z4;
  2140.                     tmp2 += z2 + z3;
  2141.                     tmp3 += z1 + z4;
  2142.                 } else {
  2143.                     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  2144.                     z1 = d7;
  2145.                     z2 = d5 + d3;
  2146.                     z3 = d7 + d3;
  2147.                     z5 = MULTIPLY(z3 + d5, FIX(1.175875602));
  2148.  
  2149.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2150.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2151.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2152.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2153.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2154.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2155.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2156.  
  2157.                     z3 += z5;
  2158.                     z4 += z5;
  2159.  
  2160.                     tmp0 += z1 + z3;
  2161.                     tmp1 += z2 + z4;
  2162.                     tmp2 += z2 + z3;
  2163.                     tmp3 = z1 + z4;
  2164.                 }
  2165.             } else {
  2166.                 if (d1) {
  2167.                     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  2168.                     z1 = d7 + d1;
  2169.                     z2 = d5;
  2170.                     z3 = d7;
  2171.                     z4 = d5 + d1;
  2172.                     z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
  2173.  
  2174.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2175.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2176.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2177.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2178.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2179.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2180.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2181.  
  2182.                     z3 += z5;
  2183.                     z4 += z5;
  2184.  
  2185.                     tmp0 += z1 + z3;
  2186.                     tmp1 += z2 + z4;
  2187.                     tmp2 = z2 + z3;
  2188.                     tmp3 += z1 + z4;
  2189.                 } else {
  2190.                     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  2191.                     tmp0 = MULTIPLY(d7, - FIX(0.601344887));
  2192.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2193.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2194.                     tmp1 = MULTIPLY(d5, - FIX(0.509795578));
  2195.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2196.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2197.                     z5 = MULTIPLY(d5 + d7, FIX(1.175875602));
  2198.  
  2199.                     z3 += z5;
  2200.                     z4 += z5;
  2201.  
  2202.                     tmp0 += z3;
  2203.                     tmp1 += z4;
  2204.                     tmp2 = z2 + z3;
  2205.                     tmp3 = z1 + z4;
  2206.                 }
  2207.             }
  2208.         } else {
  2209.             if (d3) {
  2210.                 if (d1) {
  2211.                     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  2212.                     z1 = d7 + d1;
  2213.                     z3 = d7 + d3;
  2214.                     z5 = MULTIPLY(z3 + d1, FIX(1.175875602));
  2215.  
  2216.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2217.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2218.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2219.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2220.                     z2 = MULTIPLY(d3, - FIX(2.562915447));
  2221.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2222.                     z4 = MULTIPLY(d1, - FIX(0.390180644));
  2223.  
  2224.                     z3 += z5;
  2225.                     z4 += z5;
  2226.  
  2227.                     tmp0 += z1 + z3;
  2228.                     tmp1 = z2 + z4;
  2229.                     tmp2 += z2 + z3;
  2230.                     tmp3 += z1 + z4;
  2231.                 } else {
  2232.                     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  2233.                     z3 = d7 + d3;
  2234.  
  2235.                     tmp0 = MULTIPLY(d7, - FIX(0.601344887));
  2236.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2237.                     tmp2 = MULTIPLY(d3, FIX(0.509795579));
  2238.                     z2 = MULTIPLY(d3, - FIX(2.562915447));
  2239.                     z5 = MULTIPLY(z3, FIX(1.175875602));
  2240.                     z3 = MULTIPLY(z3, - FIX(0.785694958));
  2241.  
  2242.                     tmp0 += z3;
  2243.                     tmp1 = z2 + z5;
  2244.                     tmp2 += z3;
  2245.                     tmp3 = z1 + z5;
  2246.                 }
  2247.             } else {
  2248.                 if (d1) {
  2249.                     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  2250.                     z1 = d7 + d1;
  2251.                     z5 = MULTIPLY(z1, FIX(1.175875602));
  2252.  
  2253.                     z1 = MULTIPLY(z1, FIX(0.275899379));
  2254.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2255.                     tmp0 = MULTIPLY(d7, - FIX(1.662939224));
  2256.                     z4 = MULTIPLY(d1, - FIX(0.390180644));
  2257.                     tmp3 = MULTIPLY(d1, FIX(1.111140466));
  2258.  
  2259.                     tmp0 += z1;
  2260.                     tmp1 = z4 + z5;
  2261.                     tmp2 = z3 + z5;
  2262.                     tmp3 += z1;
  2263.                 } else {
  2264.                     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  2265.                     tmp0 = MULTIPLY(d7, - FIX(1.387039845));
  2266.                     tmp1 = MULTIPLY(d7, FIX(1.175875602));
  2267.                     tmp2 = MULTIPLY(d7, - FIX(0.785694958));
  2268.                     tmp3 = MULTIPLY(d7, FIX(0.275899379));
  2269.                 }
  2270.             }
  2271.         }
  2272.     } else {
  2273.         if (d5) {
  2274.             if (d3) {
  2275.                 if (d1) {
  2276.                     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  2277.                     z2 = d5 + d3;
  2278.                     z4 = d5 + d1;
  2279.                     z5 = MULTIPLY(d3 + z4, FIX(1.175875602));
  2280.  
  2281.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2282.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2283.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2284.                     z1 = MULTIPLY(d1, - FIX(0.899976223));
  2285.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2286.                     z3 = MULTIPLY(d3, - FIX(1.961570560));
  2287.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2288.  
  2289.                     z3 += z5;
  2290.                     z4 += z5;
  2291.  
  2292.                     tmp0 = z1 + z3;
  2293.                     tmp1 += z2 + z4;
  2294.                     tmp2 += z2 + z3;
  2295.                     tmp3 += z1 + z4;
  2296.                 } else {
  2297.                     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  2298.                     z2 = d5 + d3;
  2299.  
  2300.                     z5 = MULTIPLY(z2, FIX(1.175875602));
  2301.                     tmp1 = MULTIPLY(d5, FIX(1.662939225));
  2302.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2303.                     z2 = MULTIPLY(z2, - FIX(1.387039845));
  2304.                     tmp2 = MULTIPLY(d3, FIX(1.111140466));
  2305.                     z3 = MULTIPLY(d3, - FIX(1.961570560));
  2306.  
  2307.                     tmp0 = z3 + z5;
  2308.                     tmp1 += z2;
  2309.                     tmp2 += z2;
  2310.                     tmp3 = z4 + z5;
  2311.                 }
  2312.             } else {
  2313.                 if (d1) {
  2314.                     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  2315.                     z4 = d5 + d1;
  2316.  
  2317.                     z5 = MULTIPLY(z4, FIX(1.175875602));
  2318.                     z1 = MULTIPLY(d1, - FIX(0.899976223));
  2319.                     tmp3 = MULTIPLY(d1, FIX(0.601344887));
  2320.                     tmp1 = MULTIPLY(d5, - FIX(0.509795578));
  2321.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2322.                     z4 = MULTIPLY(z4, FIX(0.785694958));
  2323.  
  2324.                     tmp0 = z1 + z5;
  2325.                     tmp1 += z4;
  2326.                     tmp2 = z2 + z5;
  2327.                     tmp3 += z4;
  2328.                 } else {
  2329.                     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  2330.                     tmp0 = MULTIPLY(d5, FIX(1.175875602));
  2331.                     tmp1 = MULTIPLY(d5, FIX(0.275899380));
  2332.                     tmp2 = MULTIPLY(d5, - FIX(1.387039845));
  2333.                     tmp3 = MULTIPLY(d5, FIX(0.785694958));
  2334.                 }
  2335.             }
  2336.         } else {
  2337.             if (d3) {
  2338.                 if (d1) {
  2339.                     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  2340.                     z5 = d1 + d3;
  2341.                     tmp3 = MULTIPLY(d1, FIX(0.211164243));
  2342.                     tmp2 = MULTIPLY(d3, - FIX(1.451774981));
  2343.                     z1 = MULTIPLY(d1, FIX(1.061594337));
  2344.                     z2 = MULTIPLY(d3, - FIX(2.172734803));
  2345.                     z4 = MULTIPLY(z5, FIX(0.785694958));
  2346.                     z5 = MULTIPLY(z5, FIX(1.175875602));
  2347.  
  2348.                     tmp0 = z1 - z4;
  2349.                     tmp1 = z2 + z4;
  2350.                     tmp2 += z5;
  2351.                     tmp3 += z5;
  2352.                 } else {
  2353.                     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  2354.                     tmp0 = MULTIPLY(d3, - FIX(0.785694958));
  2355.                     tmp1 = MULTIPLY(d3, - FIX(1.387039845));
  2356.                     tmp2 = MULTIPLY(d3, - FIX(0.275899379));
  2357.                     tmp3 = MULTIPLY(d3, FIX(1.175875602));
  2358.                 }
  2359.             } else {
  2360.                 if (d1) {
  2361.                     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  2362.                     tmp0 = MULTIPLY(d1, FIX(0.275899379));
  2363.                     tmp1 = MULTIPLY(d1, FIX(0.785694958));
  2364.                     tmp2 = MULTIPLY(d1, FIX(1.175875602));
  2365.                     tmp3 = MULTIPLY(d1, FIX(1.387039845));
  2366.                 } else {
  2367.                     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  2368.                     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  2369.                 }
  2370.             }
  2371.         }
  2372.     }
  2373.  
  2374.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  2375.  
  2376.     dataptr[0] = (short) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  2377.     dataptr[7] = (short) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  2378.     dataptr[1] = (short) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  2379.     dataptr[6] = (short) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  2380.     dataptr[2] = (short) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  2381.     dataptr[5] = (short) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  2382.     dataptr[3] = (short) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  2383.     dataptr[4] = (short) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  2384.  
  2385.     dataptr += DCTSIZE;         /* advance pointer to next row */
  2386.   }
  2387.  
  2388.   /* Pass 2: process columns. */
  2389.   /* Note that we must descale the results by a factor of 8 == 2**3, */
  2390.   /* and also undo the PASS1_BITS scaling. */
  2391.  
  2392.   dataptr = data;
  2393.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--)
  2394.   {
  2395.     /* Columns of zeroes can be exploited in the same way as we did with rows.
  2396.      * However, the row calculation has created many nonzero AC terms, so the
  2397.      * simplification applies less often (typically 5% to 10% of the time).
  2398.      * On machines with very fast multiplication, it's possible that the
  2399.      * test takes more time than it's worth.  In that case this section
  2400.      * may be commented out.
  2401.      */
  2402.  
  2403.     d0 = dataptr[DCTSIZE*0];
  2404.     d1 = dataptr[DCTSIZE*1];
  2405.     d2 = dataptr[DCTSIZE*2];
  2406.     d3 = dataptr[DCTSIZE*3];
  2407.     d4 = dataptr[DCTSIZE*4];
  2408.     d5 = dataptr[DCTSIZE*5];
  2409.     d6 = dataptr[DCTSIZE*6];
  2410.     d7 = dataptr[DCTSIZE*7];
  2411.  
  2412.     /* Even part: reverse the even part of the forward DCT. */
  2413.     /* The rotator is sqrt(2)*c(-6). */
  2414.     if (d6) {
  2415.         if (d4) {
  2416.             if (d2) {
  2417.                 if (d0) {
  2418.                     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  2419.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  2420.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  2421.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  2422.  
  2423.                     tmp0 = (d0 + d4) << CONST_BITS;
  2424.                     tmp1 = (d0 - d4) << CONST_BITS;
  2425.  
  2426.                     tmp10 = tmp0 + tmp3;
  2427.                     tmp13 = tmp0 - tmp3;
  2428.                     tmp11 = tmp1 + tmp2;
  2429.                     tmp12 = tmp1 - tmp2;
  2430.                 } else {
  2431.                     /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
  2432.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  2433.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  2434.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  2435.  
  2436.                     tmp0 = d4 << CONST_BITS;
  2437.  
  2438.                     tmp10 = tmp0 + tmp3;
  2439.                     tmp13 = tmp0 - tmp3;
  2440.                     tmp11 = tmp2 - tmp0;
  2441.                     tmp12 = -(tmp0 + tmp2);
  2442.                 }
  2443.             } else {
  2444.                 if (d0) {
  2445.                     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  2446.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  2447.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2448.  
  2449.                     tmp0 = (d0 + d4) << CONST_BITS;
  2450.                     tmp1 = (d0 - d4) << CONST_BITS;
  2451.  
  2452.                     tmp10 = tmp0 + tmp3;
  2453.                     tmp13 = tmp0 - tmp3;
  2454.                     tmp11 = tmp1 + tmp2;
  2455.                     tmp12 = tmp1 - tmp2;
  2456.                 } else {
  2457.                     /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
  2458.                     tmp2 = MULTIPLY(d6, -FIX(1.306562965));
  2459.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2460.  
  2461.                     tmp0 = d4 << CONST_BITS;
  2462.  
  2463.                     tmp10 = tmp0 + tmp3;
  2464.                     tmp13 = tmp0 - tmp3;
  2465.                     tmp11 = tmp2 - tmp0;
  2466.                     tmp12 = -(tmp0 + tmp2);
  2467.                 }
  2468.             }
  2469.         } else {
  2470.             if (d2) {
  2471.                 if (d0) {
  2472.                     /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
  2473.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  2474.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  2475.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  2476.  
  2477.                     tmp0 = d0 << CONST_BITS;
  2478.  
  2479.                     tmp10 = tmp0 + tmp3;
  2480.                     tmp13 = tmp0 - tmp3;
  2481.                     tmp11 = tmp0 + tmp2;
  2482.                     tmp12 = tmp0 - tmp2;
  2483.                 } else {
  2484.                     /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
  2485.                     z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
  2486.                     tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
  2487.                     tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
  2488.  
  2489.                     tmp10 = tmp3;
  2490.                     tmp13 = -tmp3;
  2491.                     tmp11 = tmp2;
  2492.                     tmp12 = -tmp2;
  2493.                 }
  2494.             } else {
  2495.                 if (d0) {
  2496.                     /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
  2497.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  2498.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2499.  
  2500.                     tmp0 = d0 << CONST_BITS;
  2501.  
  2502.                     tmp10 = tmp0 + tmp3;
  2503.                     tmp13 = tmp0 - tmp3;
  2504.                     tmp11 = tmp0 + tmp2;
  2505.                     tmp12 = tmp0 - tmp2;
  2506.                 } else {
  2507.                     /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
  2508.                     tmp2 = MULTIPLY(d6, - FIX(1.306562965));
  2509.                     tmp3 = MULTIPLY(d6, FIX(0.541196100));
  2510.  
  2511.                     tmp10 = tmp3;
  2512.                     tmp13 = -tmp3;
  2513.                     tmp11 = tmp2;
  2514.                     tmp12 = -tmp2;
  2515.                 }
  2516.             }
  2517.         }
  2518.     } else {
  2519.         if (d4) {
  2520.             if (d2) {
  2521.                 if (d0) {
  2522.                     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  2523.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2524.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2525.  
  2526.                     tmp0 = (d0 + d4) << CONST_BITS;
  2527.                     tmp1 = (d0 - d4) << CONST_BITS;
  2528.  
  2529.                     tmp10 = tmp0 + tmp3;
  2530.                     tmp13 = tmp0 - tmp3;
  2531.                     tmp11 = tmp1 + tmp2;
  2532.                     tmp12 = tmp1 - tmp2;
  2533.                 } else {
  2534.                     /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
  2535.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2536.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2537.  
  2538.                     tmp0 = d4 << CONST_BITS;
  2539.  
  2540.                     tmp10 = tmp0 + tmp3;
  2541.                     tmp13 = tmp0 - tmp3;
  2542.                     tmp11 = tmp2 - tmp0;
  2543.                     tmp12 = -(tmp0 + tmp2);
  2544.                 }
  2545.             } else {
  2546.                 if (d0) {
  2547.                     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  2548.                     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  2549.                     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  2550.                 } else {
  2551.                     /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
  2552.                     tmp10 = tmp13 = d4 << CONST_BITS;
  2553.                     tmp11 = tmp12 = -tmp10;
  2554.                 }
  2555.             }
  2556.         } else {
  2557.             if (d2) {
  2558.                 if (d0) {
  2559.                     /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
  2560.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2561.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2562.  
  2563.                     tmp0 = d0 << CONST_BITS;
  2564.  
  2565.                     tmp10 = tmp0 + tmp3;
  2566.                     tmp13 = tmp0 - tmp3;
  2567.                     tmp11 = tmp0 + tmp2;
  2568.                     tmp12 = tmp0 - tmp2;
  2569.                 } else {
  2570.                     /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
  2571.                     tmp2 = MULTIPLY(d2, FIX(0.541196100));
  2572.                     tmp3 = MULTIPLY(d2, FIX(1.306562965));
  2573.  
  2574.                     tmp10 = tmp3;
  2575.                     tmp13 = -tmp3;
  2576.                     tmp11 = tmp2;
  2577.                     tmp12 = -tmp2;
  2578.                 }
  2579.             } else {
  2580.                 if (d0) {
  2581.                     /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
  2582.                     tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
  2583.                 } else {
  2584.                     /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
  2585.                     tmp10 = tmp13 = tmp11 = tmp12 = 0;
  2586.                 }
  2587.             }
  2588.         }
  2589.     }
  2590.  
  2591.     /* Odd part per figure 8; the matrix is unitary and hence its
  2592.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  2593.      */
  2594.     if (d7) {
  2595.         if (d5) {
  2596.             if (d3) {
  2597.                 if (d1) {
  2598.                     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  2599.                     z1 = d7 + d1;
  2600.                     z2 = d5 + d3;
  2601.                     z3 = d7 + d3;
  2602.                     z4 = d5 + d1;
  2603.                     z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
  2604.  
  2605.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2606.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2607.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2608.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2609.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2610.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2611.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2612.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2613.  
  2614.                     z3 += z5;
  2615.                     z4 += z5;
  2616.  
  2617.                     tmp0 += z1 + z3;
  2618.                     tmp1 += z2 + z4;
  2619.                     tmp2 += z2 + z3;
  2620.                     tmp3 += z1 + z4;
  2621.                 } else {
  2622.                     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  2623.                     z1 = d7;
  2624.                     z2 = d5 + d3;
  2625.                     z3 = d7 + d3;
  2626.                     z5 = MULTIPLY(z3 + d5, FIX(1.175875602));
  2627.  
  2628.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2629.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2630.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2631.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2632.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2633.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2634.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2635.  
  2636.                     z3 += z5;
  2637.                     z4 += z5;
  2638.  
  2639.                     tmp0 += z1 + z3;
  2640.                     tmp1 += z2 + z4;
  2641.                     tmp2 += z2 + z3;
  2642.                     tmp3 = z1 + z4;
  2643.                 }
  2644.             } else {
  2645.                 if (d1) {
  2646.                     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  2647.                     z1 = d7 + d1;
  2648.                     z2 = d5;
  2649.                     z3 = d7;
  2650.                     z4 = d5 + d1;
  2651.                     z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
  2652.  
  2653.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2654.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2655.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2656.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2657.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2658.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2659.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2660.  
  2661.                     z3 += z5;
  2662.                     z4 += z5;
  2663.  
  2664.                     tmp0 += z1 + z3;
  2665.                     tmp1 += z2 + z4;
  2666.                     tmp2 = z2 + z3;
  2667.                     tmp3 += z1 + z4;
  2668.                 } else {
  2669.                     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  2670.                     tmp0 = MULTIPLY(d7, - FIX(0.601344887));
  2671.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2672.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2673.                     tmp1 = MULTIPLY(d5, - FIX(0.509795578));
  2674.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2675.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2676.                     z5 = MULTIPLY(d5 + d7, FIX(1.175875602));
  2677.  
  2678.                     z3 += z5;
  2679.                     z4 += z5;
  2680.  
  2681.                     tmp0 += z3;
  2682.                     tmp1 += z4;
  2683.                     tmp2 = z2 + z3;
  2684.                     tmp3 = z1 + z4;
  2685.                 }
  2686.             }
  2687.         } else {
  2688.             if (d3) {
  2689.                 if (d1) {
  2690.                     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  2691.                     z1 = d7 + d1;
  2692.                     z3 = d7 + d3;
  2693.                     z5 = MULTIPLY(z3 + d1, FIX(1.175875602));
  2694.  
  2695.                     tmp0 = MULTIPLY(d7, FIX(0.298631336));
  2696.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2697.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2698.                     z1 = MULTIPLY(z1, - FIX(0.899976223));
  2699.                     z2 = MULTIPLY(d3, - FIX(2.562915447));
  2700.                     z3 = MULTIPLY(z3, - FIX(1.961570560));
  2701.                     z4 = MULTIPLY(d1, - FIX(0.390180644));
  2702.  
  2703.                     z3 += z5;
  2704.                     z4 += z5;
  2705.  
  2706.                     tmp0 += z1 + z3;
  2707.                     tmp1 = z2 + z4;
  2708.                     tmp2 += z2 + z3;
  2709.                     tmp3 += z1 + z4;
  2710.                 } else {
  2711.                     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  2712.                     z3 = d7 + d3;
  2713.  
  2714.                     tmp0 = MULTIPLY(d7, - FIX(0.601344887));
  2715.                     z1 = MULTIPLY(d7, - FIX(0.899976223));
  2716.                     tmp2 = MULTIPLY(d3, FIX(0.509795579));
  2717.                     z2 = MULTIPLY(d3, - FIX(2.562915447));
  2718.                     z5 = MULTIPLY(z3, FIX(1.175875602));
  2719.                     z3 = MULTIPLY(z3, - FIX(0.785694958));
  2720.  
  2721.                     tmp0 += z3;
  2722.                     tmp1 = z2 + z5;
  2723.                     tmp2 += z3;
  2724.                     tmp3 = z1 + z5;
  2725.                 }
  2726.             } else {
  2727.                 if (d1) {
  2728.                     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  2729.                     z1 = d7 + d1;
  2730.                     z5 = MULTIPLY(z1, FIX(1.175875602));
  2731.  
  2732.                     z1 = MULTIPLY(z1, FIX(0.275899379));
  2733.                     z3 = MULTIPLY(d7, - FIX(1.961570560));
  2734.                     tmp0 = MULTIPLY(d7, - FIX(1.662939224));
  2735.                     z4 = MULTIPLY(d1, - FIX(0.390180644));
  2736.                     tmp3 = MULTIPLY(d1, FIX(1.111140466));
  2737.  
  2738.                     tmp0 += z1;
  2739.                     tmp1 = z4 + z5;
  2740.                     tmp2 = z3 + z5;
  2741.                     tmp3 += z1;
  2742.                 } else {
  2743.                     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  2744.                     tmp0 = MULTIPLY(d7, - FIX(1.387039845));
  2745.                     tmp1 = MULTIPLY(d7, FIX(1.175875602));
  2746.                     tmp2 = MULTIPLY(d7, - FIX(0.785694958));
  2747.                     tmp3 = MULTIPLY(d7, FIX(0.275899379));
  2748.                 }
  2749.             }
  2750.         }
  2751.     } else {
  2752.         if (d5) {
  2753.             if (d3) {
  2754.                 if (d1) {
  2755.                     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  2756.                     z2 = d5 + d3;
  2757.                     z4 = d5 + d1;
  2758.                     z5 = MULTIPLY(d3 + z4, FIX(1.175875602));
  2759.  
  2760.                     tmp1 = MULTIPLY(d5, FIX(2.053119869));
  2761.                     tmp2 = MULTIPLY(d3, FIX(3.072711026));
  2762.                     tmp3 = MULTIPLY(d1, FIX(1.501321110));
  2763.                     z1 = MULTIPLY(d1, - FIX(0.899976223));
  2764.                     z2 = MULTIPLY(z2, - FIX(2.562915447));
  2765.                     z3 = MULTIPLY(d3, - FIX(1.961570560));
  2766.                     z4 = MULTIPLY(z4, - FIX(0.390180644));
  2767.  
  2768.                     z3 += z5;
  2769.                     z4 += z5;
  2770.  
  2771.                     tmp0 = z1 + z3;
  2772.                     tmp1 += z2 + z4;
  2773.                     tmp2 += z2 + z3;
  2774.                     tmp3 += z1 + z4;
  2775.                 } else {
  2776.                     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  2777.                     z2 = d5 + d3;
  2778.  
  2779.                     z5 = MULTIPLY(z2, FIX(1.175875602));
  2780.                     tmp1 = MULTIPLY(d5, FIX(1.662939225));
  2781.                     z4 = MULTIPLY(d5, - FIX(0.390180644));
  2782.                     z2 = MULTIPLY(z2, - FIX(1.387039845));
  2783.                     tmp2 = MULTIPLY(d3, FIX(1.111140466));
  2784.                     z3 = MULTIPLY(d3, - FIX(1.961570560));
  2785.  
  2786.                     tmp0 = z3 + z5;
  2787.                     tmp1 += z2;
  2788.                     tmp2 += z2;
  2789.                     tmp3 = z4 + z5;
  2790.                 }
  2791.             } else {
  2792.                 if (d1) {
  2793.                     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  2794.                     z4 = d5 + d1;
  2795.  
  2796.                     z5 = MULTIPLY(z4, FIX(1.175875602));
  2797.                     z1 = MULTIPLY(d1, - FIX(0.899976223));
  2798.                     tmp3 = MULTIPLY(d1, FIX(0.601344887));
  2799.                     tmp1 = MULTIPLY(d5, - FIX(0.509795578));
  2800.                     z2 = MULTIPLY(d5, - FIX(2.562915447));
  2801.                     z4 = MULTIPLY(z4, FIX(0.785694958));
  2802.  
  2803.                     tmp0 = z1 + z5;
  2804.                     tmp1 += z4;
  2805.                     tmp2 = z2 + z5;
  2806.                     tmp3 += z4;
  2807.                 } else {
  2808.                     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  2809.                     tmp0 = MULTIPLY(d5, FIX(1.175875602));
  2810.                     tmp1 = MULTIPLY(d5, FIX(0.275899380));
  2811.                     tmp2 = MULTIPLY(d5, - FIX(1.387039845));
  2812.                     tmp3 = MULTIPLY(d5, FIX(0.785694958));
  2813.                 }
  2814.             }
  2815.         } else {
  2816.             if (d3) {
  2817.                 if (d1) {
  2818.                     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  2819.                     z5 = d1 + d3;
  2820.                     tmp3 = MULTIPLY(d1, FIX(0.211164243));
  2821.                     tmp2 = MULTIPLY(d3, - FIX(1.451774981));
  2822.                     z1 = MULTIPLY(d1, FIX(1.061594337));
  2823.                     z2 = MULTIPLY(d3, - FIX(2.172734803));
  2824.                     z4 = MULTIPLY(z5, FIX(0.785694958));
  2825.                     z5 = MULTIPLY(z5, FIX(1.175875602));
  2826.  
  2827.                     tmp0 = z1 - z4;
  2828.                     tmp1 = z2 + z4;
  2829.                     tmp2 += z5;
  2830.                     tmp3 += z5;
  2831.                 } else {
  2832.                     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  2833.                     tmp0 = MULTIPLY(d3, - FIX(0.785694958));
  2834.                     tmp1 = MULTIPLY(d3, - FIX(1.387039845));
  2835.                     tmp2 = MULTIPLY(d3, - FIX(0.275899379));
  2836.                     tmp3 = MULTIPLY(d3, FIX(1.175875602));
  2837.                 }
  2838.             } else {
  2839.                 if (d1) {
  2840.                     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  2841.                     tmp0 = MULTIPLY(d1, FIX(0.275899379));
  2842.                     tmp1 = MULTIPLY(d1, FIX(0.785694958));
  2843.                     tmp2 = MULTIPLY(d1, FIX(1.175875602));
  2844.                     tmp3 = MULTIPLY(d1, FIX(1.387039845));
  2845.                 } else {
  2846.                     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  2847.                     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  2848.                 }
  2849.             }
  2850.         }
  2851.     }
  2852.  
  2853.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  2854.  
  2855.  
  2856.     outptr[DCTSIZE*0] = limit[ (int) DESCALE(tmp10 + tmp3,
  2857.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2858.     outptr[DCTSIZE*7] = limit[ (int) DESCALE(tmp10 - tmp3,
  2859.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2860.     outptr[DCTSIZE*1] = limit[ (int) DESCALE(tmp11 + tmp2,
  2861.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2862.     outptr[DCTSIZE*6] = limit[ (int) DESCALE(tmp11 - tmp2,
  2863.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2864.     outptr[DCTSIZE*2] = limit[ (int) DESCALE(tmp12 + tmp1,
  2865.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2866.     outptr[DCTSIZE*5] = limit[ (int) DESCALE(tmp12 - tmp1,
  2867.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2868.     outptr[DCTSIZE*3] = limit[ (int) DESCALE(tmp13 + tmp0,
  2869.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2870.     outptr[DCTSIZE*4] = limit[ (int) DESCALE(tmp13 - tmp0,
  2871.                                 CONST_BITS+PASS1_BITS+3) & RANGE_MASK];
  2872.  
  2873.     dataptr++;                  /* advance pointer to next column */
  2874.     outptr++;
  2875.   }
  2876. }
  2877. /* \\\ */
  2878.  
  2879. /* /// "SelectJPEGFuncs()" */
  2880. __asm void SelectJPEGFuncs(REG(a0) struct JPEGData *spec,
  2881.                            REG(d0) uchar _gray,
  2882.                            REG(d1) uchar _dither)
  2883. {
  2884.   ulong x;
  2885.  
  2886.   JPGData=spec;
  2887.   for (x=0; x<JJ_NUM_QUANT_TBLS; x++) jpg_quant_tables[x]=spec->quantTab[x];
  2888.   if (_gray) {
  2889.     mcu111111=MCU111111to332;
  2890.     mcu211111=MCU211111to332;
  2891.     mcu221111=MCU221111to332;
  2892.     mcu411111=MCU411111to332;
  2893.     bytes_pixel=1;
  2894.   } else if (_dither) {
  2895.     mcu111111=MCU111111to332Dith;
  2896.     mcu211111=MCU211111to332Dith;
  2897.     mcu221111=MCU221111to332Dith;
  2898.     mcu411111=MCU411111to332Dith;
  2899.     bytes_pixel=1;
  2900.   } else {
  2901.     mcu111111=MCU111111toRGB;
  2902.     mcu211111=MCU211111toRGB;
  2903.     mcu221111=MCU221111toRGB;
  2904.     mcu411111=MCU411111toRGB;
  2905.     bytes_pixel=4;
  2906.   }
  2907. }
  2908. /* \\\ */
  2909.  
  2910. /* /// "DecodeJPEG()" */
  2911. __asm void DecodeJPEG(REG(a0) uchar *delta,
  2912.                       REG(a1) uchar *image,
  2913.                       REG(d0) ulong myWidth,
  2914.                       REG(d1) ulong myHeight,
  2915.                       REG(d2) ulong dsize,
  2916.                       REG(a2) struct JPEGData *spec)
  2917. {
  2918.   ulong imagex = myWidth;
  2919.   ulong imagey = myHeight;
  2920.   // void *extra = dec_info->extra;
  2921.   long base_y;
  2922.   ulong jpg_type;
  2923.   ulong interleave,row_offset;
  2924.  
  2925.   // jpg_type = (ulong)(extra);
  2926.   jpg_type=0x00;
  2927.   // xa_mjpg_kludge = (jpg_type & 0x40)?(0x40):(0x00);
  2928.   xa_mjpg_kludge=0x00;
  2929.  
  2930. /* init buffer stuff */
  2931.   jpg_init_input(delta,dsize);
  2932.  
  2933.   base_y = 0;
  2934.   while(base_y < imagey)
  2935.   {
  2936.     jpg_saw_EOI = jpg_saw_DHT = xaFALSE;
  2937.     // hier war der ganze IJPG-Kram
  2938.     {
  2939.       /* read markers */
  2940.       jpg_saw_SOI = jpg_saw_SOF = jpg_saw_SOS = jpg_saw_DHT = jpg_saw_DQT = xaFALSE;
  2941.       if (jpg_read_markers() == xaFALSE) {
  2942.         // jpg_free_stuff();
  2943.         // kprintf("JPG: rd marker err\n");
  2944.         return;
  2945.       }
  2946.       jpg_huff_reset();
  2947.  
  2948.       interleave = (jpg_height <= ((imagey>>1)+1) )?(2):(1);
  2949.       row_offset = ((interleave == 2) && (base_y == 0))?(1):(0);
  2950.     }
  2951.     jpg_marker = 0x00;
  2952.     // if (jpg_width > imagex) JPG_Alloc_MCU_Bufs(0,jpg_width,0,xaFALSE);
  2953.  
  2954.  
  2955.     if ((jpg_saw_DHT != xaTRUE) && (jpg_std_DHT_flag==0))
  2956.     {
  2957.       // DEBUG_LEVEL1 kprintf("standard DHT tables\n");
  2958.       jpg_std_DHT();
  2959.     }
  2960.     // DEBUG_LEVEL1 kprintf("JJ: imagexy %d %d  jjxy %d %d basey %d\n",imagex,imagey,jpg_width,jpg_height,base_y);
  2961.  
  2962.     if (   (jpg_num_comps == 3) && (jpg_comps_in_scan == 3)
  2963.         && (jpg_comps[1].hvsample == 0x11) && (jpg_comps[2].hvsample== 0x11) )
  2964.     {
  2965.       if (jpg_comps[0].hvsample == 0x41) /* 411 */
  2966.         { jpg_decode_411111(image,jpg_width,jpg_height,interleave,row_offset,
  2967.                         imagex,imagey); }
  2968.       else if (jpg_comps[0].hvsample == 0x22) /* 221 */
  2969.         { jpg_decode_221111(image,jpg_width,jpg_height,interleave,row_offset,
  2970.                         imagex,imagey); }
  2971.       else if (jpg_comps[0].hvsample == 0x21) /* 211 */
  2972.         { jpg_decode_211111(image,jpg_width,jpg_height,interleave,row_offset,
  2973.                         imagex,imagey); }
  2974.       else if (jpg_comps[0].hvsample == 0x11) /* 111 */
  2975.         { jpg_decode_111111(image,jpg_width,jpg_height,interleave,row_offset,
  2976.                         imagex,imagey,0); }
  2977.       else
  2978.       { // kprintf("JPG: cmps %d %d mcu %04x %04x %04x unsupported\n",
  2979.         //         jpg_num_comps,jpg_comps_in_scan,jpg_comps[0].hvsample,
  2980.         //         jpg_comps[1].hvsample,jpg_comps[2].hvsample);
  2981.         break;
  2982.       }
  2983.     }
  2984.     else if ( (jpg_num_comps == 1) || (jpg_comps_in_scan == 1) )
  2985.     {
  2986.       jpg_decode_111111(image,jpg_width,jpg_height,interleave,row_offset,
  2987.                         imagex,imagey,1);
  2988.     }
  2989.     else
  2990.     { // kprintf("JPG: cmps %d %d mcu %04x %04x %04x unsupported.\n",
  2991.       //           jpg_num_comps,jpg_comps_in_scan,jpg_comps[0].hvsample,
  2992.       //           jpg_comps[1].hvsample,jpg_comps[2].hvsample);
  2993.       break;
  2994.     }
  2995.  
  2996.     base_y += ((interleave == 1)?(imagey):(jpg_height));
  2997.     if (jpg_marker == M_EOI) { jpg_saw_EOI = xaTRUE; jpg_marker = 0x00; }
  2998.     else if (jpg_saw_EOI==xaFALSE) if (jpg_read_EOI_marker() == xaFALSE) break;
  2999.   }
  3000.   return;
  3001. }
  3002. /* \\\ */
  3003.  
  3004.